Как сделать недействительными элементы, кэшированные с использованием OutputCacheProvider в службе данных WCF? - PullRequest
1 голос
/ 28 июня 2011

У меня есть реализация кэширования данных в службе данных wcf, которая следует за этим;http://blogs.msdn.com/b/peter_qian/archive/2010/11/17/using-asp-net-output-caching-with-wcf-data-services.aspx

В конце статьи предполагается, что вы можете реализовать свой собственный провайдер кэширования, расширив OutputCacheProvider.Я сделал это и проверил, что кеш работает нормально.

Однако я не могу заставить выходной кеш работать с зависимостью кеша данных, как описано в приведенной выше статье.Как только добавление в строке;

            context.Response.AddCacheItemDependency(cacheDependencyItemKey);

, я получаю следующую ошибку:

* При использовании настраиваемого поставщика кэша вывода, такого как 'DiskOutputCache', только следующие политики истечения срока действия и кэшподдерживаются следующие функции: зависимости файлов, абсолютные истечения срока, обратные вызовы статической проверки и обратные вызовы статической замены.Описание: во время выполнения текущего веб-запроса произошло необработанное исключение.Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.Configuration.Provider.ProviderException: при использовании настраиваемого поставщика кэша вывода, такого как «DiskOutputCache», поддерживаются только следующие политики истечения срока действия и функции кэширования: зависимости файлов, абсолютные истечения, обратные вызовы статической проверки истатические обратные вызовы замещения.

Ошибка источника:

Во время выполнения текущего веб-запроса было сгенерировано необработанное исключение.Информацию о происхождении и местонахождении исключения можно определить с помощью приведенной ниже трассировки стека исключений.

Трассировка стека:

[ProviderException: только при использовании настраиваемого поставщика кэша вывода, такого как DiskOutputCache,поддерживаются следующие политики истечения срока действия и функции кэширования: файловые зависимости, абсолютные истечения срока действия, обратные вызовы статической проверки и обратные вызовы статической подстановки.] System.Web.Caching.OutputCache.InsertResponse (String cachedVaryKey, CachedVary cachedVary, String rawResponseKey, CachedRawResponse зависимость, RDDateTime absExp, TimeSpan slideExp) +2905959 System.Web.Caching.OutputCacheModule.OnLeave (источник объекта, EventArgs, eventArgs) +107 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.tt.AmpecutionStep.tt.EpecutionStep.ttp..ExecuteStep (шаг IExecutionStep, логическое и завершено синхронно) +75 ***

    protected override void OnStartProcessingRequest(ProcessRequestArgs args)
    {
        base.OnStartProcessingRequest(args);

        HttpContext context = HttpContext.Current;
        if (context.Cache.Get(cacheDependencyItemKey) == null) {
            // what the cache item value is doesn't really matter 
            context.Cache.Insert(cacheDependencyItemKey, "Item");
        }

        if (context.Request.HttpMethod.Equals("POST", StringComparison.OrdinalIgnoreCase) ||
            context.Request.HttpMethod.Equals("MERGE", StringComparison.OrdinalIgnoreCase) ||
            context.Request.HttpMethod.Equals("PUT", StringComparison.OrdinalIgnoreCase) ||
            context.Request.HttpMethod.Equals("DELETE", StringComparison.OrdinalIgnoreCase)) {
            context.Cache.Remove(cacheDependencyItemKey);

        } else {
            // set cache policy to this page 
            HttpCachePolicy cachePolicy = context.Response.Cache;

            // server&private: server and client side cache only 
            cachePolicy.SetCacheability(HttpCacheability.ServerAndPrivate);

            // default cache expire: never 
            cachePolicy.SetExpires(DateTime.MaxValue);

            // cached output depends on: accept, charset, encoding, and all parameters (like $filter, etc) 
            cachePolicy.VaryByHeaders["Accept"] = true;
            cachePolicy.VaryByHeaders["Accept-Charset"] = true;
            cachePolicy.VaryByHeaders["Accept-Encoding"] = true;
            cachePolicy.VaryByParams["*"] = true;

            cachePolicy.SetValidUntilExpires(true);

            // add data cache dependency 
            context.Response.AddCacheItemDependency(cacheDependencyItemKey);
        }
    }

Эта ошибка может свидетельствовать о невозможности использования кэшаeItemDependency в WCF, как это.Я в замешательстве, так как кажется, что работает в статье блога msdn.

Есть мысли?

Пакетные обновления кажутся проблемными

В данныхсервисы, когда вы используете DataServiceContext и excute SaveChanges (SaveChangesOptions.Batch); URI запроса выглядит как "~ / $ batch", поэтому не кажется, что это простой способчтобы фактически определить, что создается, обновляется или удаляется при попытке сделать недействительными эти элементы.

Я предполагаю, что в приведенном ниже логическом блоке для изменений данных веб-службы вам придется вызывать команду remove непосредственно в кеше.и пусть провайдер кэша нижнего уровня решит, что нужно удалить.Но, похоже, нет простого способа определить, что изменилось.Я что-то здесь упускаю?

1 Ответ

0 голосов
/ 30 июня 2011

Кажется, это нужно сделать в вашем пользовательском OutputCacheProvider.Согласно статье: «Обратите внимание, что если вы пойдете по этому пути, то вы не сможете добавить выходные зависимости страниц к элементам кэша данных. Вам придется реализовать логику зависимостей внутри вашего провайдера».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...