У меня есть реализация кэширования данных в службе данных 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 непосредственно в кеше.и пусть провайдер кэша нижнего уровня решит, что нужно удалить.Но, похоже, нет простого способа определить, что изменилось.Я что-то здесь упускаю?