如何使在WCF数据服务中使用OutputCacheProvider缓存的项无效?

时间:2011-06-28 01:51:16

标签: asp.net wcf caching .net-4.0

我在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缓存提供程序计算出需要删除的内容。但似乎没有一种简单的方法可以确切地确定发生了什么变化。我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:0)

这似乎需要在您的自定义OutputCacheProvider中完成。根据文章:“请注意,如果你走这条路线,那么就不能将输出页面依赖关系添加到数据缓存项目中。你必须在你的提供者中实现依赖逻辑。”