C#
我试图确保某个页面不会被缓存,并且在用户单击后退按钮时从不显示。 这非常高评价的答案(目前1068 upvotes)说使用:
Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "0");
但是在IIS7 / ASP.NET MVC中,当我发送这些头文件时,客户端会看到这些响应头文件:
Cache-control: private, s-maxage=0 // that's not what I set them to
Pragma: no-cache
Expires: 0
缓存控制标题发生了什么? IIS7或ASP.NET本地的东西是否覆盖它? 我检查了我的解决方案,并且没有覆盖此标头的代码。
当我添加Response.Headers.Remove("Cache-Control");
首先,它没有区别:
Response.Headers.Remove("Cache-Control");
Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "0");
当我添加一个[OutputCache]
属性时:
[OutputCache(Location = OutputCacheLocation.None)]
public ActionResult DoSomething()
{
Response.Headers.Remove("Cache-Control");
Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "0");
var model = DoSomething();
return View(model);
}
然后客户端响应标题变为:
Cache-control: no-cache
Pragma: no-cache
Expires: 0
哪个更接近,但仍然不是我想发送的标题。 这些标题在哪里被覆盖,我该如何阻止它?
编辑:我检查和不正确的标题正在发送到Chrome,FF,IE和Safari,所以它看起来是一个服务器问题,而不是浏览器相关的问题。
通过试验和错误,我发现为ASP.NET MVC中的IIS7正确设置标题的一种方法是:
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "0");
第一行将Cache-control
为no-cache
,第二行添加其他属性no-store, must-revalidate
。
这可能不是唯一的方法,但是如果更直接的Response.AppendHeader("Cache-control", "no-cache, no-store, must-revalidate");
确实提供了另一种方法Response.AppendHeader("Cache-control", "no-cache, no-store, must-revalidate");
失败。
其他相关的IIS7缓存控制问题可以通过以下方式解决:
上一篇: c#
下一篇: How to prevent reloading of web page from cache while using mobile safari browser?