我没有完全理解 .NET MVC 的 HTTP 缓存是如何工作的,因为它看起来并不像实际上是在检索缓存的资源文件。我想我需要在某处添加一些额外的代码......
首先,让我们看看我是如何在静态内容(即图像)上设置 HTTP 缓存的。在我的 web.config 中,我有以下内容:
<system.webServer>
<staticContent>
<clientCache cacheControlMode="UseExpires" httpExpires="Tue, 19 Jan 2038 03:14:07 GMT" />
</staticContent>
</system.webServer>
这导致我的应用程序中的图像似乎正在正确缓存。当我查看图像的响应标头时,我看到了这个(删除了不必要的标头):
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
我看到了一个很好的 ETag 值,而我的 Expires 应该是这样的。此外,Last-Modified 日期是过去的日期。我理解 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
MVC 缓存文件的响应标头缺少一个 ETag。静态内容响应标头中不存在“public”的 Cache-Control 值。最后,Expires 是 Last-Modified 日期后 1 年,这是正确的,但 Last-Modified 日期始终与 Date 值相同。对我来说,这些响应标头看起来像是第一次从服务器请求资源并缓存时的样子,而不是随后请求并从缓存中检索资源时的样子。
提前感谢您的任何见解。
更新:它实际上似乎在 IE 中进行缓存。后续请求的 Last-Modified 日期仍然是过去的值。不过,我在 FF 或 Chrome 中没有看到这一点。我确认在这两种浏览器中,我都没有禁用缓存。是什么赋予了?