2009-07-16 76 views
4

我刚刚开始在我的一些控制器操作中使用OutputCache,并且我没有完全得到我期望的响应。ASP.NET MVC:OutputCache和http headers

我已经将缓存时间设置为5分钟,并且Expires报头与Last-Modified报头相同,这是发出请求的时间。

这头我目前得到:

Date     Thu, 16 Jul 2009 06:35:07 GMT 
Server     Microsoft-IIS/6.0 
X-Powered-By   ASP.NET 
X-AspNet-Version  2.0.50727 
X-AspNetMvc-Version  1.0 
Content-Encoding  gzip 
Cache-Control   public, max-age=300 
Expires     Thu, 16 Jul 2009 06:35:06 GMT 
Last-Modified   Thu, 16 Jul 2009 06:35:03 GMT 
Vary     * 
Content-Type   text/html; charset=utf-8 
Content-Length   575 

这头我希望:

Date     Thu, 16 Jul 2009 06:35:07 GMT 
Server     Microsoft-IIS/6.0 
X-Powered-By   ASP.NET 
X-AspNet-Version  2.0.50727 
X-AspNetMvc-Version  1.0 
Content-Encoding  gzip 
Cache-Control   public, max-age=300 
Expires     Thu, 16 Jul 2009 06:40:06 GMT 
Last-Modified   Thu, 16 Jul 2009 06:35:03 GMT 
Vary     * 
Content-Type   text/html; charset=utf-8 
Content-Length   575 

为什么它会做任何想法?

干杯 安东尼

回答

5

max-age优先(从RFC 2616):

我们使用术语expires_value到 表示的值的到期 报头。我们使用术语 max_age_value来表示缓存控制报头 的“max-age” 指令在响应中携带的 秒的合适值(见14.9.3节)。

的最大年龄指令优先 超过到期,所以如果最大年龄是存在于响应 ,计算 简单:

freshness_lifetime = max_age_value 

否则,如果到期时 存在于响应,该 计算方法是:

freshness_lifetime = expires_value - date_value 

所以客户应该使用缓存如你所期望的那样。

+0

Humm是否仅适用于HTTP/1.1?因为我使用的只是支持HTTP/1.0的代理。那么这仍然适用? – 2009-07-16 07:13:19

+0

代理支持的内容仅与代理对内容的作用不同。发送的标头取决于输出缓存属性中指定的缓存位置。 – bzlm 2009-09-21 20:28:00

+1

Cache-Control标头是在HTTP/1.1中引入的,用于处理Expires标头中的限制。问题是Expires头文件设置了一个固定的失效日期,如果客户端和服务器时钟不同步,会导致问题。 当使用支持HTTP/1.1(几乎所有浏览器)的浏览器时,Expires标头将被忽略,以支持Cache-Control - max-age标头。使用Expires标头的唯一时间是请求来自仅支持HTTP/1.0而不是HTTP/1.1的浏览器。 – 2010-01-31 13:57:28