我不确定这是否是服务器问题,或者我是否无法理解HTTP缓存是如何工作的。
我有一个在IIS7上运行的ASP MVC应用程序。作为网站的一部分,有很多静态内容,包括大量的CSS,Javascript和图像文件。
对于这些文件,我希望浏览器将它们缓存至少一天 - 我们的.css,.js,.gif和.png文件很少更改。
我的web.config是这样的:
<system.webServer>
<staticContent>
<clientCache cacheControlMode="UseMaxAge"
cacheControlMaxAge="1.00:00:00" />
</staticContent>
</system.webServer>
我得到的问题是浏览器(经过测试的Chrome,IE8和FX)似乎没有像我期望的那样缓存文件。我有默认设置(在IE中自动检查新页面)。
首次访问内容时按预期下载
HTTP/1.1 200 OK
Cache-Control: max-age=86400
Content-Type: image/gif
Last-Modified: Fri, 07 Aug 2009 09:55:15 GMT
Accept-Ranges: bytes
ETag: "3efeb2294517ca1:0"
Server: Microsoft-IIS/7.0
X-Powered-By: ASP.NET
Date: Mon, 07 Jun 2010 14:29:16 GMT
Content-Length: 918
<content>
我认为 Cache-Control: max-age=86400
应告诉浏览器一天不再请求该页面。
好的,现在重新加载页面,浏览器再次请求图像。这次它使用这些标头获得空响应:
HTTP/1.1 304 Not Modified
Cache-Control: max-age=86400
Last-Modified: Fri, 07 Aug 2009 09:55:15 GMT
Accept-Ranges: bytes
ETag: "3efeb2294517ca1:0"
Server: Microsoft-IIS/7.0
X-Powered-By: ASP.NET
Date: Mon, 07 Jun 2010 14:30:32 GMT
所以看起来浏览器发送了 ETag
返回(作为资源的唯一ID),服务器返回一个 304未修改 - 告诉浏览器它可以使用以前下载的文件。
在我看来,这对许多缓存情况都是正确的,但在这里我不想要额外的往返。当服务器上的文件发生变化时,我不关心图像是否过时。
有很多这些文件(即使使用精灵地图等),我们的许多客户都有非常慢的网络。为此每次往返 304 状态大约需要10到5秒。许多人还拥有IE6,它一次只有2个HTTP连接。最终结果是我们的应用程序对于这些客户端来说似乎非常慢,每个页面花费额外的几秒钟来检查静态内容是否未发生变化。
我错过了什么响应标题会导致浏览器积极地缓存文件?
我如何在IIS7的.Net web.config中设置它?
我是否误解了HTTP缓存的工作原理?