Internet Explorer/Firefox中的硬刷新和XMLHttpRequest缓存

7 javascript asp.net internet-explorer caching xmlhttprequest

我做了一个Ajax请求,在其中我设置了响应可缓存性和最后修改的头:

if (!String.IsNullOrEmpty(HttpContext.Current.Request.Headers["If-Modified-Since"]))
{
    HttpContext.Current.Response.StatusCode = 304;
    HttpContext.Current.Response.StatusDescription = "Not Modified";
    return null;
}
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Public);
HttpContext.Current.Response.Cache.SetLastModified(DateTime.UtcNow);
Run Code Online (Sandbox Code Playgroud)

这按预期工作.我第一次发出Ajax请求200 OK.我第二次得到304 Not Modified.

当我在Chrome中刷新硬盘(Ctrl + F5)时,我觉得200 OK很棒!

当我在Internet Explorer/Firefox中进行硬刷新时,我得到了304 Not Modified.但是,每个其他资源(JS/CSS/HTML/PNG)都会返回200 OK.

原因是因为无论这些浏览器中的硬刷新如何,都会为XMLHttpRequest发送"If-Not-Modified"标头.我相信Steve Souders 在这里记录它.

我试过设置一个ETag并调整"If-None-Match"无济于事(在Steve Souders页面的评论中提到过).

这里有没有人有任何智慧的宝石?

谢谢,本

更新

我可以针对存储的上次修改日期检查"If-Modified-Since".但是,希望这个问题能够帮助那些发现标题设置不正确的其他SO用户.

更新2

虽然每次都使用"If-Modified-Since"标头发送请求.如果未设置到期日期或将其设置为将来日期,Internet Explorer甚至不会发出请求.无用!

更新3

这也许现在是一个实时博客.当localhost时,Internet Explorer不会打扰第二个请求.使用真实IP或环回将起作用.

Eri*_*Law 2

在 IE10 之前,IE 不应用刷新标志(请参阅http://blogs.msdn.com/b/ieinternals/archive/2010/07/08/technical-information-about-conditional-http-requests-and-the -refresh-button.aspx ) 来处理不是作为文档加载的一部分发出的请求。

如果需要,您可以调整目标 URL 以包含随机数,以防止缓存的副本满足未来的请求。或者,您可以发送 max-age=0 来强制 IE 在每次重用之前有条件地重新验证资源。

至于为什么浏览器会重用未指定生存期的缓存资源,请参见http://blogs.msdn.com/b/ie/archive/2010/07/14/caching-improvements-in-internet-explorer -9.aspx