我在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”等自定义输出缓存提供程序时,仅支持以下过期策略和缓存功能:文件依赖性,绝对过期,静态验证回调和静态替换回调。 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.Configuration.Provider.ProviderException:使用自定义输出缓存提供程序(如“DiskOutputCache”)时,仅支持以下过期策略和缓存功能:文件依赖性,绝对过期,静态验证回调和静态替换回调
来源错误:
在执行当前Web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息。
堆栈追踪:
[ProviderException:当使用像'DiskOutputCache'这样的自定义输出缓存提供程序时,只支持以下过期策略和缓存功能:文件依赖性,绝对过期,静态验证回调和静态替换回调。 System.Web.Caching.OutputCache.InsertResponse(String cachedVaryKey,CachedVary cachedVary,String rawResponseKey,CachedRawResponse rawResponse,CacheDependency dependencies,DateTime absExp,TimeSpan slidingExp)+2905959 System.Web.Caching.OutputCacheModule.OnLeave(Object source,EventArgs eventArgs)+107 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+148 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously)+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);
}
}
这个错误似乎暗示你不能像这样在WCF中使用CacheItemDependency。我很困惑,因为它似乎在msdn博客文章中工作。
有什么想法吗?
批量更新似乎有问题
在数据服务中使用 DataServiceContext 并执行 SaveChanges(SaveChangesOptions.Batch); 请求uri看起来像“〜/ $ batch”所以没有'似乎是一种简单的方法来实际确定正在创建,更新或删除的内容,以尝试使这些项无效。
我假设在下面的逻辑块中更改了Web服务数据,您必须直接在缓存上调用remove,并让underyling缓存提供程序计算出需要删除的内容。但似乎没有一种简单的方法可以确切地确定发生了什么变化。我在这里错过了什么吗?
答案 0 :(得分:0)
这似乎需要在您的自定义OutputCacheProvider中完成。根据文章:“请注意,如果你走这条路线,那么就不能将输出页面依赖关系添加到数据缓存项目中。你必须在你的提供者中实现依赖逻辑。”