2009-02-18 47 views
5

在此处对'Expires'标题非常困惑! 有时它按预期工作 - 有时候不会。在Chrome中测试时过期标题

我正在使用以下代码来设置我的过期标题。请注意,这是在ASP.NET中使用MVC自定义属性完成的 - 这里没有真正相关的内容 - 但解释了'filterContext'的来源。

HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache; 
TimeSpan cacheDuration = TimeSpan.FromSeconds(Duration); 

// my own custom header so we know what time it was 
filterContext.HttpContext.Response.AddHeader("CurrentTime", DateTime.Now.ToString()); 

cache.SetCacheability(HttpCacheability.Public); 
cache.SetExpires(DateTime.Now.Add(cacheDuration)); 
cache.SetMaxAge(cacheDuration); 
cache.AppendCacheExtension("must-revalidate, proxy-revalidate"); 

这有时让我头是这样的:

Cache-Control: public, must-revalidate, proxy-revalidate, max-age=413 
Date: Wed, 18 Feb 2009 05:24:19 GMT 
Expires: Wed, 18 Feb 2009 05:21:12 GMT 
CurrentTime: 2/17/2009 9:21:12 PM 

有时候是这样的:

Cache-Control: public, must-revalidate, proxy-revalidate, max-age=600 
Date: Wed, 18 Feb 2009 05:27:55 GMT 
Expires: Wed, 18 Feb 2009 05:27:55 GMT 
CurrentTime: 2/17/2009 9:27:55 PM 

我通过提琴手运行一切,看的时候看到的东西都重新请求以及何时来自浏览器缓存。

现在怪异的事情是在IE缓存总是按预期工作。我的ASP.NET MVC操作方法的链接出现在Fiddler中,然后当我再次单击相同的链接时,它将从缓存中获取。

但是在Chrome中,它有时会并且有时不会来自缓存!来自缓存我的意思是没有额外的HTTP请求。

比如像这样的链接:

http://ipv4.fiddler:62669/gallery/mainimage/2 

将来自于IE缓存,但回来与铬200。然后有时在Chrome中,它来自缓存。我已经尝试清空浏览器缓存并重试 - 每次都有相同的结果。

Chrome是否试图做一些'聪明',只是失败 - 或者我需要额外的头?

什么我不知道是如果有什么关系的事实,我Expires头日期是从来没有真正的未来。如果我看看他们的hosted jQuery file的谷歌标题,我看到标题如下(在2010年到期 - 在未来一年)。

Cache-Control: public, max-age=31536000 
Date: Wed, 18 Feb 2009 05:44:53 GMT 
Expires: Thu, 18 Feb 2010 05:44:53 GMT 

实际上未来会过期吗?

按照HTTP spec

如果响应包括一个Expires 报头和最大年龄指令,则 最大年龄指令覆盖的 Expires头,即使过期 报头是更具限制性。此规则 允许原始服务器为给定响应提供 ,向HTTP/1.1(或以后的 )高速缓存提供更长的到期时间,而不是向HTTP/1.0 高速缓存提供更长的到期时间。如果某些 HTTP/1.0缓存不正确计算 年龄或到期时间,可能是由于 到不同步的时钟,这可能是有用的。

因此,即使'Expires'与当前时间相同,Chrome似乎应该尊重max-age指令,但似乎并没有这样做。

回答

3

我发现,在ASP.NET MVC的源代码如下:

public virtual void RenderView(ViewContext viewContext) { 
     // TODO: Remove this hack. Without it, the browser appears to always load cached output 
     viewContext.HttpContext.Response.Cache.SetExpires(DateTime.Now); 
     ViewUserControlContainerPage containerPage = new ViewUserControlContainerPage(this); 
     // Tracing requires Page IDs to be unique. 
     ID = Guid.NewGuid().ToString(); 

     RenderViewAndRestoreContentType(containerPage, viewContext); 
    } 

因此,这解释了为什么我Expires头始终是当前的时间。不过我真的不认为这是什么绊倒了镀铬becasue我创建了一个最简单的页面如下,和Chrome仍然很愉快地回到服务器,并给了我一个200

public partial class test : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     TimeSpan cacheDuration = TimeSpan.FromSeconds(33); 
     var cache = Response.Cache; 

     cache.SetCacheability(HttpCacheability.Public); 
     cache.SetExpires(DateTime.Now.Add(cacheDuration)); 
     cache.SetMaxAge(cacheDuration); 
     cache.AppendCacheExtension("must-revalidate, proxy-revalidate"); 
    } 
} 
+0

我甚至为这个aspx页面添加了<%= DateTime.Now.ToString()%>,并在网络上运行它,并且它每次都返回200,并更新时间。但在IE中它被缓存了33秒。弄乱 – 2009-02-18 07:42:55

1

我已经几乎得出结论,这是铬做的事情真的很缓慢与缓存。

我将它简化为尽可能低的级别 - 从Google服务器获取jQuery。

我输入:

http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js 

Chrome浏览器,和提琴手想出了以下要求:

Requests started at: 22:58:00:7756 
Responses completed at: 22:58:03:5020 
Total Sequence time: 00:00:02.7263880 
DNS Lookup time: 531ms 
TCP/IP Connect time: 63ms 

RESPONSE CODES 
-------------- 
HTTP/200: 1 

的标题如下(注过期今天1年后):

Cache-Control: public, max-age=31536000 
Date: Wed, 18 Feb 2009 06:58:01 GMT 
Expires: Thu, 18 Feb 2010 06:58:01 GMT 
Vary: Accept-Encoding 

然后我等了几下conds并点击进入 - 在同一个选项卡中。菲德勒又生** 200 *请求:

Requests started at: 22:58:09:2516 
Responses completed at: 22:58:12:3999 
Total Sequence time: 00:00:03.1482360 

RESPONSE CODES 
-------------- 
HTTP/200: 1 

而且标题为:

Cache-Control: public, max-age=31536000 
Date: Wed, 18 Feb 2009 06:58:09 GMT 
Expires: Thu, 18 Feb 2010 06:58:09 GMT 
Vary: Accept-Encoding 

显然,这不是我所期待的。

- Accept-Encoding对于这两个请求都是相同的。

- 第三请求给我一个304

这是一个新的Chrome,我从来没有做过任何发展上的安装 - 和上我只刚刚安装提琴手的第时间。

我无法等待别人向我解释。现在我放弃了 - 我认为我的缓存和过期代码很好。另外ASP.NET MVC似乎迫使Expires成为当前时间。这显然不是我的谷歌示例中的一个因素。

我认为Chrome是太聪明了,这必须是一个错误 - 我在版本1.0.154.48。

相关问题