ASP.NET MVC OutputCache因*而异,因用户cookie而异

时间:2011-03-20 21:52:10

标签: c# asp.net-mvc outputcache

我有一个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);
}

已经玩了好几个小时了,我完全陷入困境,希望有人有个想法......

3 个答案:

答案 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

所以在安装之前请仔细考虑!