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

Car*_*lis 8 .net c# asp.net-mvc caching outputcache

这个问题与我的另一个问题有关.

我有一个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();
    }
Run Code Online (Sandbox Code Playgroud)

有一个控制器操作我想要启用缓存.我用这个OutputCache属性装饰了这个动作:

[OutputCache(Duration = 300, VaryByParam = "id")]
Run Code Online (Sandbox Code Playgroud)

现在这个动作会发生什么?它是否因为OutputCache属性而被缓存,还是因为响应头而没有缓存?

- 编辑 -

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

Mar*_*ell 7

这两件事是分开的; 响应缓存主要是查看客户端看到的内容 - 他们将在不命中服务器的情况下使用什么,或者他们将发送到服务器的修改日期.

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

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

  • 这只是部分正确.[来自MSDN的[OutputCacheLocation.Any值](http://msdn.microsoft.com/en-us/library/system.web.ui.outputcachelocation.aspx):"输出缓存可以位于浏览器客户端(其中请求发起的,在参与请求的代理服务器(或任何其他服务器)上,或在处理请求的服务器上.那么在这种情况下客户端缓存会发生什么? (2认同)

Car*_*lis 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));
        }
    }
Run Code Online (Sandbox Code Playgroud)

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