IE 8 和客户端缓存

Posted

技术标签:

【中文标题】IE 8 和客户端缓存【英文标题】:IE 8 and client-side caching 【发布时间】:2012-01-11 00:04:59 【问题描述】:

背景故事:

我在 IIS 6 Web 服务器上有一个 .NET 3.5 的 Web 门户。目前有一个页面被赋予了一个值,并基于该值在 Web 服务上查找 PDF 文件,并在网页的另一个选项卡中向用户显示结果。这是通过以下代码完成的。

 context.Response.ClearContent();
 context.Response.ClearHeaders();
 context.Response.Clear();
 context.Response.AddHeader("Accept-Header", pdfStream.Length.ToString());                                               
 context.Response.ContentType = "application/pdf";
 context.Response.BinaryWrite(pdfStream.ToArray());
 context.Response.Flush();

这行得通,并且已经工作了多年。但是,我们从客户端收到了一个问题,即特定客户端每次都将 PDF 作为相同的 PDF 返回,直到他们清除临时 Internet 缓存。

我觉得很酷,这很简单。我只会将缓存标头添加到响应中以从不缓存它。所以我添加了以下内容:

context.Response.Cache.SetCacheability(HttpCacheability.NoCache);//IE set to not cache
context.Response.Cache.SetNoStore();//Firefox/Chrome not to cache
context.Response.Cache.SetExpires(DateTime.UtcNow); //for safe measure expire it immediately 

经过快速测试,我得到了响应标头中的预期结果。

Cache-Control    no-cache, no-store 
Pragma    no-cache 
Expires    -1 

问题:

所以这上线了。第一天一切看起来都很酷。第二天,bam,每个人都开始出现白屏,没有显示 PDF。经过进一步调查,我发现它只是 IE 6,7,8。 Chrome 很好,Firefox 很好,Safari 很好,甚至 IE 9 也很好。在不知道为什么会发生这种情况的情况下,我恢复了我的更改并部署了它,一切又开始工作了。

我已经搜索了所有内容,试图找出为什么我的缓存标头似乎混淆了 IE 6-8 无济于事。有没有人遇到过 IE 6-8 的此类问题?有什么我想念的吗?感谢您提供任何见解。

【问题讨论】:

【参考方案1】:

我找到了解决方案。这是给我的提示。 Here is a link

如果 IE8(及更低版本)具有 no-cachestore-cache,则基本上 IE8(及更低版本)的 Cache-Control 标头存在问题。我基本上只允许私有缓存并将最大期限设置为非常短,因此它几乎立即过期,从而解决了这个问题。

//Ie 8 and lower have an issue with the "Cache-Control no-cache" and "Cache-Control store-cache" headers.
//The work around is allowing private caching only but immediately expire it.
if ((Request.Browser.Browser.ToLower() == "ie") && (Request.Browser.MajorVersion < 9))

     context.Response.Cache.SetCacheability(HttpCacheability.Private);
     context.Response.Cache.SetMaxAge(TimeSpan.FromMilliseconds(1));

else

     context.Response.Cache.SetCacheability(HttpCacheability.NoCache);//IE set to not cache
     context.Response.Cache.SetNoStore();//Firefox/Chrome not to cache
     context.Response.Cache.SetExpires(DateTime.UtcNow); //for safe measure expire it immediately

【讨论】:

感谢您发布此信息。我浪费了很多时间和很多挫折来试图弄清楚这一点。

以上是关于IE 8 和客户端缓存的主要内容,如果未能解决你的问题,请参考以下文章

asp.net 服务器端缓存与客户端缓存 [转]

浏览器缓存原理简述

vue ie浏览器 页面缓存 不请求接口

浏览器缓存和服务器缓存

请问通过iframe内嵌的jsp在ie缓存里面找不到啊,如何才能看到这个jsp返回到客户的html呢

PHP 能将数据入浏览器缓存吗?如果能求讲解!