MVC OutputCaching是否优先于设置缓存响应头?

时间:2010-11-02 13:26:38

标签: c# .net asp.net-mvc caching outputcache

此问题与my other question有关。

我有一个MVC应用程序,禁用所有控制器操作的缓存。我这样做是通过在Application_BeginRequest中设置缓存响应标头:

    protected void Application_BeginRequest()
    {
        HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
        HttpContext.Current.Response.Cache.SetValidUntilExpires(false);
        HttpContext.Current.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        HttpContext.Current.Response.Cache.SetNoStore();
    }

我确实需要启用缓存的单个控制器操作。我使用OutputCache属性修饰了此操作:

[OutputCache(Duration = 300, VaryByParam = "id")]

此行动现在会发生什么?它是否因为OutputCache属性而被缓存,或者由于响应头而没有缓存?

- 编辑 -

看起来,响应标头优先。所以我的问题变成:如何为单个控制器操作启用缓存?再次覆盖响应头?

2 个答案:

答案 0 :(得分:7)

这两件事是分开的;响应缓存主要 查看客户端看到的内容 - 他们将使用什么而不会访问服务器,或者他们将发送到服务器的修改日期。

然而,OutputCache专注于服务器;请求仍然发生(与客户端缓存的内容不同),但有可能(希望可能)不会调用您的方法:相反,将返回缓存版本。

所以:客户端没有缓存;发出HTTP请求,并且(对于相同id内存允许的5分钟内的请求),从服务器返回缓存版本(通常会减少IO和CPU负载)服务器)。有意义吗?

答案 1 :(得分:2)

响应标头强制执行缓存控制。解决方案不是为需要缓存的控制器操作设置响应头。我现在使用的自定义缓存属性也在请求项字典中设置OutputCache键,而不是使用ISCACHED。我的问题中的代码段已更改为:

    protected void Application_EndRequest()
    {
        if (HttpContext.Current.Items["ISCACHED"] == null)
        {
            var cache = HttpContext.Current.Response.Cache;
            cache.SetCacheability(HttpCacheability.NoCache);
            cache.SetNoStore();
            cache.SetExpires(DateTime.Now.AddDays(-1));
        }
    }

我必须将其从BeginRequest移至EndRequest,以允许操作首先设置ISCACHED请求项。如果已设置,则控制器已处理此请求的缓存,否则将禁用缓存。