26

当他们加载网页时,我想在他们的浏览器上缓存图像、css和javascript客户端。有太多不同类型的缓存,我对哪些与 asp.net mvc 一起使用感到困惑。

是否也可以让他们的浏览器检查这些文件的新版本或修改版本?

谢谢!

4

6 回答 6

47

您需要在服务器上设置缓存控制标头。您可以通过将其粘贴在您的 web.config 中来做到这一点:

<system.webServer>
  <staticContent>
     <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00" />
  </staticContent>
</system.webServer>

这将告诉浏览器现在甚至在 30 天内检查任何静态内容的新内容。

对于第二个问题,请提供一些向内容添加查询字符串的机制。在我当前的项目中,我们将 javascript 和 css 作为构建的一部分进行压缩和组合。将链接放入页面时如下所示:

<script src="/Resources/Javascript/Combined.js?v=2.2.0.1901" type="text/javascript"></script>

查询字符串是 Major.Minor.0.Changeset 编号,并且在我们推送构建时随时更改,导致客户端重新获取它。同样的事情发生在其<link>元素中的样式表上。

于 2010-01-20T22:32:04.280 回答
6

实际上,浏览器会自动为您解决这个问题。您必须竭尽全力让它们不缓存 css、js、html 和图像。

我对 ASP MVC 不太熟悉,但我认为您正在考虑的缓存类型是针对您创建的动态输出服务器端的操作码缓存?

于 2010-01-20T22:25:44.763 回答
4

@Paul Creasey 和 @Salsa 都是正确的,只要链接相同,浏览器就会默认处理缓存。

正如您所提到的,当您需要更新这些文件时,这会引发一个问题,因为您无法保证客户端的浏览器会检查更新的版本。在许多情况下,他们仅在经过固定时间后才这样做,这可能会造成糟糕的用户体验。

关于如何处理提醒客户端浏览器刷新缓存,该站点上已经提出了许多问题。简而言之,当您更改文件的内容时,它们都依赖于更改链接。

您可以将参数附加到仅用于缓存目的的 URL,例如:

<script src="/myJavascript.js?version=4"></script>

然后,当您更改内容并需要强制客户端刷新这个答案时,只需更改版本号。

于 2010-01-20T22:32:24.627 回答
2

查看我在此处发布的答案,该解决方案可以最大限度地利用缓存的好处,并避免需要用户“硬”刷新 ( Ctrl+ F5) 的任何问题。

它在 URL 中使用内容本身的 MD5 哈希,这样只要文件相同,URL 就保持不变,这才是真正的目标。计算哈希的速度非常快,并且它缓存在服务器的内存中,因此页面渲染不会明显减慢。整个过程以微秒为单位进行测量,到目前为止,好处(在我的潜水员网站上)非常棒。我将它应用于所有图像、CSS 和 JS,但 CSS 文件中的图像除外,因为它们不是在我的网站上由服务器生成的(还)。

于 2011-06-22T15:24:56.607 回答
0

这最好在 IIS 或您的配置文件中完成 - 确保您的 CSS/JS/图像设置为永不过期。

当您从代码中引用它们时,我建议将版本或构建日期附加到文件名,例如 script.js?20100120,这样当您确实要更改它们时,只需更改版本即可强制刷新来自所有缓存它的浏览器。

于 2010-01-20T22:33:45.810 回答
-2

当您正确设置 Cache-Control 标头并设置 web.config时,浏览器会自动处理客户端缓存。像那样 :

<system.webServer>
    <staticContent>
        <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="00.00:10:00" />
    </staticContent>
</system.webServer>
于 2010-01-20T22:26:08.103 回答