【问题标题】:Why are my aspx pages not being cached on the client?为什么我的 aspx 页面没有缓存在客户端上?
【发布时间】:2011-03-01 02:05:20
【问题描述】:

我有一个动态生成的 CSS 文件。它相当大,并且针对不同的浏览器具有不同的内容。它很少改变。

所以在.aspx 页面的顶部我有:

<%@ OutputCache Duration="86400" 
                Location="ServerAndClient" 
                VaryByParam="none" 
                VaryByCustom="browser" %>

我有一个针对生成动态图像的 MVC 操作的类似指令:

[OutputCache(Duration = 86400, 
             VaryByParam = "none", 
             Location = OutputCacheLocation.ServerAndClient)] 

这应该会导致文件在服务器和客户端(但不是中间代理)上缓存一天。

响应标头似乎是正确的:

HTTP/1.1 200 OK
Cache-Control: private, max-age=83831
Content-Type: text/css; charset=utf-8
Expires: Wed, 09 Jun 2010 08:52:45 GMT
Last-Modified: Tue, 08 Jun 2010 08:52:45 GMT
Vary: *
Server: Microsoft-IIS/7.0
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
Date: Tue, 08 Jun 2010 09:35:34 GMT
Content-Length: 70073

服务器端缓存有效 - 进一步的请求不会再次执行代码。

但是,客户端缓存以两种不同的方式被破坏:首先,在每个页面上再次请求内容,尽管它应该被缓存。

为什么浏览器会再次请求内容?

其次,当再次向服务器请求内容时,它会返回一个 HTTP 200 以及整个内容。它应该返回一个没有正文的 HTTP 304 Not Modified - 告诉浏览器重新使用它已经下载的内容。

如何确保在内容未更改时它返回 HTTP 304

【问题讨论】:

    标签: asp.net asp.net-mvc http iis-7 caching


    【解决方案1】:

    1) 变化: * 会导致某些浏览器,例如 IE,不缓存。变化:用户代理可能会更好(不确定)。

    2) WRT 200 vs 304:客户端是否发送 If-* 标头?

    【讨论】:

    • 干杯 - 看起来 vary:* 标头是 IE 没有缓存的原因(又一个 IE 错误!)通过将 &lt;system.web&gt;&lt;caching&gt;&lt;outputCache omitVaryStar="true" /&gt;&lt;/caching&gt;&lt;/system.web&gt; 添加到 web.config 来修复
    • 客户端没有发送 If-None-Match 请求标头 - 可能是因为响应中没有 ETag
    • 它可以发送一个 If-Modified-Since,但当然最好还是提供一个 ETag。
    • 这看起来像 ASP.Net 中的一个错误 - 如果我删除 VaryByCustom="browser",则 304 请求与 If-Modified-Since 一起正常工作。我已将其更改为 VaryByHeader="User-Agent" 并按预期工作。
    猜你喜欢
    • 2011-02-02
    • 2012-02-16
    • 2011-05-17
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多