【问题标题】:MVC's HTTP Caching - Last-Modified response header always equals DateMVC 的 HTTP 缓存 - Last-Modified 响应标头始终等于 Date
【发布时间】:2014-03-31 06:44:19
【问题描述】:

我没有完全理解 .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 文件的响应标头。提醒一下,this 文章指出“Bundles 在创建 bundle 一年后设置 HTTP Expires Header。”

    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 值相同。对我来说,这些响应标头看起来像是第一次从服务器请求资源并缓存时的样子,而不是随后从缓存中请求和检索资源时的样子。

提前感谢您的任何见解。

UPDATE:它实际上似乎在 IE 中进行缓存。后续请求的 Last-Modified 日期仍然是过去的值。不过,我在 FF 或 Chrome 中没有看到这一点。我确认在这两种浏览器中,我都没有禁用缓存。什么给了?

【问题讨论】:

  • 您是否在使用任何类型的代理或过滤拦截器?我在调试具有许多相同症状的问题时遇到了这个问题,并确定这是一个公司代理扣留了对捆绑包的更新
  • @meklarian:感谢您的参与。当我登录时,我确实很可能在公司代理背后!

标签: asp.net-mvc http-headers expires-header


【解决方案1】:

首先,system.webServer/staticContent/clientCache 仅适用于静态资源(文件)。所以直接访问图片就可以了。

包是动态资源(处理程序正在生成内容)。这就是配置指令不适用的原因。


其次,使用ETag、Expires、Last-Modified是三种不同的缓存技术。您不应该同时使用这两种技术,因为它们的工作方式不同。

Expires 告诉浏览器将文件保存在缓存中直到指定的日期。 在该日期之前,浏览器永远不会调用服务器。

ETag 是一种动态缓存机制。 浏览器会一直调用服务器,但如果内容没有改变,服务器可能不会响应。

Last-Modified 是一种古老的动态缓存机制。它的工作方式与ETag 相同,但需要公开正确的修改日期。在创建动态内容时,这不是一件容易的事。

我认为结合多种技术应该只用于经过深思熟虑的案例。有关详细信息,请参阅此answer。

您可能想阅读基础知识:HTTP caching


然后对于您的问题,我不确定为什么您的应用会公开这么多标头。捆绑包上Last-Modified 的存在解释起来很奇怪。一个包是一个虚拟的东西,它将各种文件组合为一个。所以它没有真正的最后修改日期。您是否使用了额外的缓存代码/模块?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 2010-12-28
    • 2017-09-06
    • 1970-01-01
    相关资源
    最近更新 更多