Asp.net mvc 为什么firefox会往返服务器以确定是否修改了我的文件?

Asp.net mvc 为什么firefox会往返服务器以确定是否修改了我的文件?,asp.net-mvc,firefox,http-headers,Asp.net Mvc,Firefox,Http Headers,我的网站上有一些静态内容,我已经设置了缓存(使用Asp.NET MVC)。据Firebug称,我第一次打开页面时,Firefox会发送以下请求: GET /CoreContent/Core.css?asm=0.7.3614.34951 Host: 127.0.0.1:3916 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR

我的网站上有一些静态内容,我已经设置了缓存(使用Asp.NET MVC)。据Firebug称,我第一次打开页面时,Firefox会发送以下请求:

GET /CoreContent/Core.css?asm=0.7.3614.34951
Host: 127.0.0.1:3916
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/css,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://127.0.0.1:3916/Edit/1/101
Cookie: .ASPXAUTH=52312E5A802C1A079E2BA29AA2BFBC5A38058977B84452D62ED52855D4164659B4307661EC73A307BFFB2ED3871C67CB3A9AAFDB3A75A99AC0A21C63A6AADE9A11A7138C672E75125D9FF3EFFBD9BF62
Pragma: no-cache
Cache-Control: no-cache
GET /CoreContent/Core.css?asm=0.7.3614.34951
Host: 127.0.0.1:3916
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/css,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://127.0.0.1:3916/Edit/1/101
Cookie: .ASPXAUTH=52312E5A802C1A079E2BA29AA2BFBC5A38058977B84452D62ED52855D4164659B4307661EC73A307BFFB2ED3871C67CB3A9AAFDB3A75A99AC0A21C63A6AADE9A11A7138C672E75125D9FF3EFFBD9BF62
If-Modified-Since: Mon, 23 Nov 2009 18:39:20 GMT
Cache-Control: max-age=0
“我的服务器”将使用以下命令答复:

Server: ASP.NET Development Server/9.0.0.0
Date: Mon, 23 Nov 2009 18:44:41 GMT
X-AspNet-Version: 2.0.50727
X-AspNetMvc-Version: 1.0
Cache-Control: public, max-age=31535671
Expires: Tue, 23 Nov 2010 18:39:12 GMT
Last-Modified: Mon, 23 Nov 2009 18:39:12 GMT
Vary: *
Content-Type: text/css
Content-Length: 15006
Connection: Close
到目前为止,一切顺利。但是,如果我刷新Firefox(不是缓存清除刷新,只是正常刷新),在刷新周期内,Firefox将再次向服务器发出以下请求:

GET /CoreContent/Core.css?asm=0.7.3614.34951
Host: 127.0.0.1:3916
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/css,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://127.0.0.1:3916/Edit/1/101
Cookie: .ASPXAUTH=52312E5A802C1A079E2BA29AA2BFBC5A38058977B84452D62ED52855D4164659B4307661EC73A307BFFB2ED3871C67CB3A9AAFDB3A75A99AC0A21C63A6AADE9A11A7138C672E75125D9FF3EFFBD9BF62
Pragma: no-cache
Cache-Control: no-cache
GET /CoreContent/Core.css?asm=0.7.3614.34951
Host: 127.0.0.1:3916
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/css,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://127.0.0.1:3916/Edit/1/101
Cookie: .ASPXAUTH=52312E5A802C1A079E2BA29AA2BFBC5A38058977B84452D62ED52855D4164659B4307661EC73A307BFFB2ED3871C67CB3A9AAFDB3A75A99AC0A21C63A6AADE9A11A7138C672E75125D9FF3EFFBD9BF62
If-Modified-Since: Mon, 23 Nov 2009 18:39:20 GMT
Cache-Control: max-age=0
我的服务器对其响应
304未修改

为什么Firefox会发出第二个请求?在第一个响应中,我说缓存不会过期一年(我打算在事情发生变化时使用查询参数)。我是否必须添加另一个响应标题以防止这种额外的往返


编辑:无论我是否按“刷新”,或是否再次转到页面(或引用相同外部文件的不同URL),都没有关系。Firefox也同样如此。此外,我并不认为这是FF中的一个bug,我只是想知道是否还有另一个标题可以设置,这意味着“此文档永远不会更改,不要再打扰我了”。

对于所有现代浏览器来说,这种行为似乎都是“设计的”。在IE中,您可以调查相同的情况。点击F5总是导致浏览器检查内容是否被修改。在缓存清除请求期间,浏览器不传递上次修改的头,服务器必须返回HTTP 200(不是HTTP 304),因此304在您的情况下并没有那么糟糕。

显然,问题是由于响应中添加了
Vary:
头。要在Asp.Net中删除此项,请将其添加到
部分内的web.config:

<caching>
    <outputCache omitVaryStar="true"/>
</caching>


对我来说,这个开关似乎是“是的,我想要一个工作行为,而不是一个非工作行为”,但一旦你找到它,翻转它是微不足道的。

所以服务器没有办法说“这个文件永远不会改变。如果你不是绝对需要的话,不要再打扰我了”?我不是100%确定,尤其是对于所有的浏览器,但根据我自己的经验,我认为答案是“不可能”。如果用户未点击F5,浏览器将使用缓存版本。主要建议:当用户点击F5时,不要忘记上次修改和ETag HTTP头,因为否则将重新加载静态内容,这比304响应要昂贵得多。我注意到缓存控制:无缓存和缓存控制:无缓存:GET请求中的最大年龄=0头。也许这就是问题所在?根据:当客户端尝试重新验证缓存项时,它收到的响应包含的日期头似乎比现有项的日期头旧,则客户端应无条件重复该请求,并包括缓存控制:max age=0…谢谢,但这些头是从FF发送的。问题是我是否可以在服务器上说“相信我,这个文件永远不会更改。请不要再打扰我了。”我可以问你为什么只提到FireFox而不提到其他浏览器的行为吗?您是否解决了这些其他浏览器的问题,或者根本不关心它们?说真的,我也对这种“永远缓存”的行为感兴趣,如果它存在的话。谢谢。我之所以只提到Firefox,是因为我只看到Firefox中的行为,因为我只检查过Firefox。原因是Firebug使所有FF net请求的se都变得很容易。尽管我尝试过fiddler/IE,但自从我使用localhost(或127.0.0.1)作为我的服务器以来,我还没有成功。