此问题与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属性而被缓存,或者由于响应头而没有缓存?
- 编辑 -
看起来,响应标头优先。所以我的问题变成:如何为单个控制器操作启用缓存?再次覆盖响应头?
答案 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
请求项。如果已设置,则控制器已处理此请求的缓存,否则将禁用缓存。