我有一个asp.net mvc 3项目,我有一个家庭控制器。我已使用此属性标记了我的索引操作:
[OutputCache(Location = System.Web.UI.OutputCacheLocation.Any, Duration = 120, VaryByParam = "*", VaryByCustom = "user")]
public ActionResult Index()
{
return View();
}
根据用户自定义的变化在Global.asax.cs中处理以检查用户cookie值,以便根据用户是否登录以及他们是什么用户来更改缓存。
当我在我的网络服务器上访问此页面时,我在响应中收到了这些标题:
Cache-Control public, max-age=120
Content-Type text/html; charset=utf-8
Content-Encoding gzip
Expires Sun, 20 Mar 2011 21:50:09 GMT
Last-Modified Sun, 20 Mar 2011 21:48:09 GMT
Vary Accept-Encoding
Date Sun, 20 Mar 2011 21:48:09 GMT
Content-Length 3105
立即关闭,Vary - Accept-Encoding值看起来不对,不应该发送Vary - *而不是吗?
我也将User.Identity.Name属性呈现给此视图,我注意到即使我注销它仍会呈现用户名,直到120秒到期。
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if (custom.Equals("user", StringComparison.OrdinalIgnoreCase))
{
HttpCookie cookie = context.Request.Cookies["user"];
if (cookie != null)
{
return cookie.Value;
}
}
return base.GetVaryByCustomString(context, custom);
}
已经玩了好几个小时了,我完全陷入困境,希望有人有个想法......
答案 0 :(得分:17)
您可以让IIS通过在web.config中的urlCompression元素上设置dynamicCompressionBeforeCache="true"
来压缩响应,然后再进行缓存。这将导致返回预期的Vary:*
标头。
摘自IIS Configuration Reference,关于dynamicCompressionBeforeCache属性:
dynamicCompressionBeforeCache 属性指定IIS是否将动态压缩尚未缓存的内容。当 dynamicCompressionBeforeCache 属性为 true 时,IIS会在第一次发出请求时动态压缩响应,并对内容进行排队以进行压缩。后续请求将动态提供,直到压缩响应已添加到缓存目录。将压缩响应添加到缓存目录后,缓存的响应将发送到客户端以用于后续请求。当 dynamicCompressionBeforeCache 为 false 时,IIS会返回未压缩的响应,直到压缩响应已添加到缓存目录中。
答案 1 :(得分:4)
问题是IIS动态压缩。它会破坏http标头。我通过使用actionfilter滚动自己的动态压缩来解决它。
答案 2 :(得分:0)
此版本有Microsoft HotFix,但他们不会让您下载此修复程序。
您必须填写电子邮件,以便他们发送给您,并说:
从我所看到的,它会产生以下问题
更多信息:
http://support2.microsoft.com/kb/2877816/en-gb
http://blogs.iis.net/erez/archive/2013/08/02/iis-compression-overrides-the-vary-header.aspx
https://51degrees.com/support/documentation/net/iis-modification
所以在安装之前请仔细考虑!