为什么我的aspx页面没有被缓存在客户端上?

问题描述:

我有一个动态生成的CSS文件。它相当大,并且针对不同的浏览器具有不同的内容。它很少改变。为什么我的aspx页面没有被缓存在客户端上?

所以在.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

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

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

+1

干杯 - 看起来像这样'变化:*'头是IE没有高速缓存的理由通过添加''到网络固定的(另一IE错误!) .config – Keith 2010-06-08 10:07:06

+0

虽然客户端不发送'If-None-Match'请求头 - 可能是因为响应中没有'ETag'。 – Keith 2010-06-08 10:08:37

+1

它可以发送一个If-Modified-Since,但是当然提供一个ETag是可取的。 – 2010-06-08 10:51:20