MVC3 OutputCache VaryByHeader =未设置Cookie

时间:2012-06-22 10:04:48

标签: asp.net asp.net-mvc-3

我有以下行动方法:

[HttpGet, Authorize, OutputCache(Duration = 60, VaryByHeader = "Cookie", Location = OutputCacheLocation.Any)]
public ActionResult Index()

但是当我提出请求时,这些是发出的标题:

Cache-Control: private, max-age=60, s-maxage=0
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Expires: Fri, 22 Jun 2012 09:56:32 GMT
Last-Modified: Fri, 22 Jun 2012 09:55:32 GMT
Vary: Accept-Encoding

为什么不包括Vary中的Cookie标头?

我尝试了OutputCache设置的多种变体但无济于事(

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:0)

因此响应包含在由Andrew Bullock链接的网页文件名",又名" iis压缩覆盖了变化标题"。

但自2013年12月起,可以使用修补程序(可在Andrew Bullock链接中找到)。像往常一样,此修补程序可能包含在常规修补程序中,因此请确保在应用它之前仍需要它。

因为它是"最佳实践"要明确地从链接提供信息而不是仅提供链接(如果页面出现故障),这里有一个摘要:

IIS动态压缩会覆盖Vary标头。这似乎适用于从版本5到版本8的IIS(当从msdn博客和msdn kb累积信息时)。如果需要,请禁用IIS动态压缩,或尝试应用http://support.microsoft.com/kb/2877816/en-us处提供的修补程序。 (此问题可能由Windows 8.1 / 2012 R2系列上的常规修补程序修复。此修补程序从IIS 7开始提供,在win7 sp1上进行了个人测试,尚未在我的服务器上进行测试。)

在我的具体情况中,我还有另一个问题:asp.net没有发出任何Vary标头(已启用或未启用压缩),outputCache location设置为{{1} }。将其设置为Client"已解决"这个附加问题。但当然,这会产生将DownstreamCache-Control更改为private的副作用。 (现在可以在代理上缓存,而不是仅在客户端浏览器上缓存。)