1

我想阻止浏览器缓存我的软件给定版本的 JavaScript、CSS 和图像文件。

我正在将 ASP.NET MVC3 与 Spark 视图引擎一起使用,我相信我可以通过将自定义查询字符串参数附加到使用虚拟路径呈现的图像、脚本和样式表 URL 中来完成此操作。如,<script type="text/javascript" src="~/path/to/script.css"></script>将呈现为<script type="text/javascript" src="/myApplication/path/to/script.css?2.3.0"></script>.

这是可以做到的吗?我是在正确的轨道上,还是我可以做其他事情?

谢谢!

编辑

我正在查看 IIS 中的 ETag,这似乎可以很好地完成这项工作。我做了一些测试,它似乎工作。这看起来是合理的解决方案吗?

4

2 回答 2

3

你在正确的轨道上。只需将版本号附加到您的静态资源,并在您更改它们时增加此编号。

你可以自动化这个过程。将静态资源组合到一个文件中以避免来自客户端浏览器的多个请求是一种很好的做法。在此过程中,您可以添加版本号或仅添加结果文件的哈希值。这样,如果生成的文件更改,哈希也会更改。

例如,Web 优化框架是您可以签出的东西,它可以自动执行这些任务。

因此,在应用程序中安装Microsoft.AspNet.Web.OptimizationNuGet 后,您可以在以下位置定义捆绑包Application_Start

var bundles = BundleTable.Bundles;
bundles.Add(
    new ScriptBundle("~/bundles/jquery").Include("~/Scripts/jquery-{version}.js")
);

然后在您的视图中按名称引用:

@Scripts.Render("~/bundles/jquery")

当您在发布模式下运行时(debug="false"在您的 web.config 中),这将呈现为:

<script src="/bundles/jquery?v=wBUqTIMTmGl9Hj0haQMeRbd8CoM3UaGnAwp4uDEKfnM1"></script>

这个框架非常强大,因为它允许您将多个静态资源组合到一个包中,并且还将它们最小化,将带宽消耗降至最低。它还负责缓存这些静态资源并根据内容附加版本号。因此,如果您的原始内容发生更改,生成的版本号也会更改,并将其从客户端浏览器缓存中逐出。

该框架随 ASP.NET MVC 4 一起提供,因此有一天当您升级应用程序时,您无需更改任何内容,因为这是现在处理静态资源的默认机制。

于 2012-10-10T16:56:39.320 回答
0

这绝对是一种方法,但使用查询字符串作为缓存破坏器并不是最好的主意。

另一种方法是在浏览器的 url 中放置一个时间戳,然后重写该服务器端。

例如,使用url rewrite 扩展创建一个类似的规则:

<rule name="AutoVersioningOfCSSAndJS" stopProcessing="true">
  <match url="^(.*)\.[\d]{8}\.(css|js)$" ignoreCase="true" />
  <action type="Rewrite" url="{R:1}.{R:2}" />
  <conditions>
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
  </conditions>
</rule>

然后使用 8 位时间戳呈现您的标签:

<script type="text/javascript" src="~/path/to/script.20121010.css"></script>
于 2012-10-10T17:05:29.897 回答