ASP.NET MVC 输出缓存变化由 * 和用户 cookie 变化。

20

我有一个asp.net mvc 3项目,其中包含一个主页控制器。 我已经使用以下属性标记了我的Index动作:

[OutputCache(Location = System.Web.UI.OutputCacheLocation.Any, Duration = 120, VaryByParam = "*", VaryByCustom = "user")]
public ActionResult Index()
{
    return View();
}

在 Global.asax.cs 中处理了用户自定义的 vary 字段,检查用户 cookie 值,以便根据用户是否已登录以及用户是谁来更改缓存。

当我访问我的 Web 服务器上的此页面时,我会在响应中得到这些头:

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个回答

18

您可以在web.config中的urlCompression元素上设置dynamicCompressionBeforeCache="true",让IIS在缓存响应之前进行压缩。这将导致预期的Vary:*头被返回。

摘自IIS配置参考关于dynamicCompressionBeforeCache属性的说明:

dynamicCompressionBeforeCache属性指定IIS是否动态压缩尚未缓存的内容。当dynamicCompressionBeforeCache属性为true时,IIS会在第一次请求时动态压缩响应并将内容排队等待压缩。随后的请求将动态服务,直到压缩响应已添加到缓存目录。一旦压缩响应添加到缓存目录,缓存响应将发送给客户端以供后续请求使用。当dynamicCompressionBeforeCachefalse时,IIS将返回未经压缩的响应,直到压缩响应已添加到缓存目录。


非常好的提示。我不知道为什么它在IIS7.0中默认为false,这会导致错误的输出缓存。 - Felipe Pessoto

4
问题出在IIS动态压缩上,它会破坏HTTP头。我通过使用ActionFilter编写自己的动态压缩来解决这个问题。

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

在安装之前请仔细考虑!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接