为啥 FireFox 3.6.8 不缓存来自 asp.net 开发者服务器的静态内容?

Posted

技术标签:

【中文标题】为啥 FireFox 3.6.8 不缓存来自 asp.net 开发者服务器的静态内容?【英文标题】:Why does FireFox 3.6.8 not cache static contents from asp.net developer server?为什么 FireFox 3.6.8 不缓存来自 asp.net 开发者服务器的静态内容? 【发布时间】:2011-04-01 09:30:31 【问题描述】:

我正在开发一个 asp.net 网站,就像普通用户一样,我们在编码和测试期间使用 asp.net 开发人员服务器。 今天,我发现firefox没有缓存我网站的任何静态文件,因为我们的应用程序很大,它使页面加载时间很慢。 我检查了firefox about:cache,所有的静态文件缓存设置看起来像

           Key: http://localhost:26851/App_Layout/icons/actions/email/folder.png
     Data size: 871 bytes
   Fetch count: 1
 Last modified: 2010-08-19 11:59:46
       Expires: 1969-12-31 16:00:00

           Key: http://localhost:26851/Framework/ScriptLibrary/JQueryPlugins/ui.mouse.js
     Data size: 5079 bytes
   Fetch count: 1
 Last modified: 2010-08-19 11:59:39
       Expires: 1969-12-31 16:00:00

FireBug 显示这样的标题

Server  ASP.NET Development Server/9.0.0.0
Date    Thu, 19 Aug 2010 22:10:27 GMT
X-AspNet-Version    2.0.50727
Cache-Control   public
Etag    "1CB3F32C834A880"
Content-Type    text/css
Content-Length  1775
Connection  Close

Firebug 有另一个标签叫做“缓存”,信息是:

Last Modified   Thu Aug 19 2010 15:10:27 GMT-0700 (Pacific Daylight Time)
Last Fetched    Thu Aug 19 2010 15:10:27 GMT-0700 (Pacific Daylight Time)
Expires Wed Dec 31 1969 16:00:00 GMT-0800 (Pacific Standard Time)
Data Size   1775
Fetch Count 10
Device  disk

过期日期设置回 1969-12-31,我相信这就是它们加载时间非常长的原因。 我正在使用 Visual Studio 2008、Windows 7 机器。该应用程序在 IE 中运行良好,内容被正确缓存。

以前有人见过这种行为吗?

【问题讨论】:

使用Live Http Headers 或类似名称,然后发布您的网站发送的实际响应标头。 【参考方案1】:

ASP.net 开发服务器

根据我对Fiddler2的运行,它缓存了文件,即304s(未修改)响应完成

ScriptResource.axd WebResource.axd

在 IE 8 和 FF 3.6.8 中出现相同的行为 IE8 必须设置为自动检查页面的新版本才能发生这种情况。


IIS

在 IIS 上运行它会导致 FF 和 IE 缓存静态内容。


这种缓存是由于网络服务器在响应中添加了last-modified 标头。

您可以使用 localhost. 代替 (http://weblogs.asp.net/asptest/archive/2008/08/13/tip-on-using-fiddler-with-cassini-and-localhost.aspx) 让 fiddler 收听 localhost

【讨论】:

browser.cache.check_doc_frequency 的默认值为 3。当我使用 XP 时,本地主机工作正常。 模式 3 似乎与 IE 自动检查新版本相同。 kb.mozillazine.org/Browser.cache.check_doc_frequency【参考方案2】:

您需要发出 Expires 标头以使 Firefox 缓存文件。

否则,你认为它如何猜测它需要缓存文件多长时间?

【讨论】:

这是正确答案。没有“过期”标题是您的问题。 如果我创建一个新项目,一切正常。问题是它之前没有添加过期标头。我遇到了静态内容(gif、css)的问题。一旦我移动到生产站点,我们可以在 IIS 中设置过期时间。我不认为硬编码过期是一个好主意。我怀疑窗口 7 或最新的 Firefox 发生了一些变化。【参考方案3】:

您可以尝试将其中之一添加到您的页面加载功能 -

选项 1

        Response.ClearHeaders();
        Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
        Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
        Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
        Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
        Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1 
        Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1 
        Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1 
        Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.1 
        Response.AppendHeader("Keep-Alive", "timeout=3, max=993"); // HTTP 1.1 
        Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.1

选项 2

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1))
Response.Cache.SetCacheability(HttpCacheability.NoCache)
Response.Cache.SetNoStore()

【讨论】:

@Russel Yang - 此答案的任何更新。我在我的一个网络应用程序中使用它并且没有发现任何问题。如果您遇到此代码的任何问题,请告诉我,以便我可以尝试您的方案并更新我的应用程序 我相信这会奏效。我只是不明白为什么 Firefox 没有缓存静态文件。 IE 7 没有任何问题(访问相同的 asp.net 服务器)。它之前没有添加响应头就可以工作。切换到 Window 7 和 Firefox 3.6.8 后,我注意到了这种字符串行为【参考方案4】:

您也可以在本地 IIS WebServer 上托管页面,而不是在 VS 开发服务器中运行它。在 IIS 中,您可以根据需要指定过期标头设置。

【讨论】:

我的网站在 IIS 中运行没有任何问题。您知道 asp.net 开发人员服务器提供了更轻松的调试体验。【参考方案5】:

感谢大家帮助这个问题。我相信我找到了 FireFox 在 windows 7 盒子上看起来很慢的原因。我在使用 windows XP 时没有注意到速度慢。

首先,Firefox 不会缓存来自 asp.net Web 开发者服务器的任何资源。这个事实在 XP 或 Window 7 中没有改变。 当我今天使用 firebug 检查资源下载时,我注意到 DNS 查找需要几秒钟。然后我发现windows 7默认安装,windows\system32\driver\etc下的HOSTS文件没有DNS条目127.0.0.1 localhost。通过将此行添加到 HOSTS 文件。我的网站和以前一样快。

【讨论】:

还要注意 IPv6 导致的这种情况 (::1) 请参阅 ***.com/questions/1726585/…

以上是关于为啥 FireFox 3.6.8 不缓存来自 asp.net 开发者服务器的静态内容?的主要内容,如果未能解决你的问题,请参考以下文章

AS3-来自URL的缓存图像

为啥 event.clientX 在 firefox 中为 dragend 事件错误地显示为 0?

tag showing as a different size on chrome and firefox

Youtube Flash API (AS3) 在 Firefox 中不工作,但在 Chrome 中工作

为啥 Firefox 不等待 WebSocket 连接?

为啥 Chrome 或 Firefox 不显示待处理请求的请求标头?