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属性而被缓存,还是因为响应头而没有缓存?
- 编辑 -
看起来,响应标头优先.所以我的问题变成:如何为单个控制器操作启用缓存?再次覆盖响应头?
这两件事是分开的; 响应缓存主要是查看客户端看到的内容 - 他们将在不命中服务器的情况下使用什么,或者他们将发送到服务器的修改日期.
但是,OutputCache专注于服务器 ; 请求仍然会发生(与客户端缓存的内容不同),但有可能(希望可能)不会调用您的方法:相反,将返回缓存版本.
所以:它没有缓存在客户端; 发出HTTP请求,并且(对于5分钟内的请求,对于相同的id内存允许),从服务器返回缓存版本(通常减少服务器上的IO和CPU负载).合理?
响应标头强制执行缓存控制。解决方案是不为需要缓存的控制器操作设置响应标头。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)
我必须将其从 移至BeginRequest,EndRequest以允许操作首先设置ISCACHED请求项。如果设置了,则控制器已经处理了该请求的缓存,否则缓存将被禁用。
| 归档时间: |
|
| 查看次数: |
1501 次 |
| 最近记录: |