首页 > 解决方案 > MVC - 缓存控制不适用于静态内容

问题描述

在我们的应用程序中,我们希望缓存静态内容,如图像、css 等。出于安全原因,我们添加了 HTTP 标头:

<httpProtocol>
  <customHeaders>
    <!-- Add custom headers to not allow the page content to be cached -->
    <add name="Cache-Control" value="no-cache, no-store, must-revalidate" />
    <add name="Pragma" value="no-cache" />
    <add name="Expires" value="0" />
  </customHeaders>
</httpProtocol>

现在假设验证请求并在验证后使用缓存。但它不起作用。即使是相同的请求,它仍然会一次又一次地加载静态内容。

我尝试在配置中添加自定义代码如下

<staticContent>
  <clear/>
  <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="00:10:00" />
  <mimeMap fileExtension=".jpg" mimeType="image/jpg"/>
  <mimeMap fileExtension=".png" mimeType="image/png"/>
  <mimeMap fileExtension=".css" mimeType="text/css"/>
  <mimeMap fileExtension=".js" mimeType="text/javascript"/>
</staticContent>

它仍然不起作用。

我不想使用输出缓存。

有什么选择吗?

标签: c#cachingmodel-view-controllerhttp-headers

解决方案


no-store完全禁用缓存MDN link#1 , MDN link#2

据我了解,您只需要一个标题:

<add name="Cache-Control" value="no-cache" />

首次加载浏览器加载资源: 在此处输入图像描述 注意状态码为 200,响应大小为 8 KB。服务器应添加(IIS自动执行)Etag标头(例如Etag: "8099f82b154d41:0")然后浏览器缓存文件并保存Etag值。在下一页重新加载浏览器将该值作为If-None-Match请求标头(例如If-None-Match: "8099f82b154d41:0")发送。服务器检查该值,如果文件未更改,则使用 304 http-code 响应: 在此处输入图像描述 注意状态代码为 304,响应大小为 117 B。在这种情况下,使用缓存文件。

如果服务器上的文件将被更改,服务器将响应一个新文件和 200 个 http-code,不会使用缓存。


推荐阅读