im1*_*ike 7 asp.net-mvc http-headers expires-header
我不完全理解.NET MVC的HTTP缓存是如何工作的,因为它似乎并没有真正检索缓存的资源文件.我想我需要在某处添加一些额外的代码......
首先,我们来看看我如何在静态内容(即图像)上设置HTTP缓存.在我的web.config中,我有以下内容:
<system.webServer>
<staticContent>
<clientCache cacheControlMode="UseExpires" httpExpires="Tue, 19 Jan 2038 03:14:07 GMT" />
</staticContent>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
这导致我的应用程序中的图像看起来正确缓存.当我查看图像的响应标头时,我看到了这一点(删除了不必要的标头):
Date:Thu, 27 Feb 2014 16:27:48 GMT
ETag:"086f8d199a4ce1:0"
Expires:Tue, 19 Jan 2038 03:14:07 GMT
Last-Modified:Thu, 29 Aug 2013 09:26:20 GMT
Run Code Online (Sandbox Code Playgroud)
我看到一个好的ETag值,我的Expires应该是它的.此外,Last-Modified日期已过去.我理解上次修改日期是服务器上次要求该文件的日期.
现在让我们看一下由MVC优化的javascript文件的响应头.作为提醒,该文章指出," 捆绑设置HTTP捆绑在创建时从Expires头一年. "
Cache-Control:public
Date:Thu, 27 Feb 2014 16:44:16 GMT
Expires:Fri, 27 Feb 2015 16:44:16 GMT
Last-Modified:Thu, 27 Feb 2014 16:44:16 GMT
Vary:User-Agent
Run Code Online (Sandbox Code Playgroud)
MVC缓存文件的响应标头缺少ETag.Cache-Control值为"public",静态内容响应头上没有.最后,Expires是Last-Modified日期之后的1年,这是正确的,但Last-Modified日期始终与Date值相同.对我来说,这些响应标题看起来就像是第一次从服务器请求并缓存资源时的情况,而不是随后从缓存中请求和检索资源时的情况.
提前感谢您的任何见解.
更新:它实际上似乎是在IE中缓存.后续请求的上次修改日期仍为过去的值.不过,我在FF或Chrome中没有看到这一点.我确认在这两种浏览器中,我都没有禁用缓存.是什么赋予了?
首先,system.webServer/staticContent/clientCache仅适用于静态资源(文件)。所以如果你直接访问图片就可以了。
捆绑包是动态资源(处理程序正在生成内容)。这就是配置指令不适用的原因。
其次,使用ETag、Expires、Last-Modified是三种不同的缓存技术。您不应该同时使用这两种技术,因为它们的工作方式不同。
Expires告诉浏览器将文件保留在缓存中直到指定日期。在此日期之前,浏览器永远不会调用服务器。
ETag是一种动态缓存机制。浏览器总是会调用服务器,但如果内容没有改变,服务器可能不会响应内容。
Last-Modified是一种古老的动态缓存机制。它的工作方式与此相同,ETag但有一个有问题的要求,即公开正确的修改日期。在创建动态内容时,这并不是一件容易找到的事情。
我认为结合多种技术应该只适用于深思熟虑的情况。有关详细信息,请参阅此答案。
您可能想阅读基础知识:HTTP 缓存
然后对于您的问题,我不确定为什么您的应用程序会暴露这么多标头。捆绑包上的的存在Last-Modified解释起来很奇怪。捆绑包是一种虚拟的东西,它将各种文件组合为一个。所以它没有最后修改的实际日期。您是否使用额外的缓存代码/模块?