强制客户端浏览器重新下载我们的 asp.net Web 应用程序的 .css 和 .js 文件的优雅方式(不完全禁用缓存)

Posted

技术标签:

【中文标题】强制客户端浏览器重新下载我们的 asp.net Web 应用程序的 .css 和 .js 文件的优雅方式(不完全禁用缓存)【英文标题】:Elegant way to force client browsers to re-download our asp.net web app's .css and .js files (without totally disabling caching) 【发布时间】:2013-07-11 16:47:21 【问题描述】:

我们的 asp.net Web 应用程序允许我们的(大型).css 和 .js 文件被客户端浏览器缓存以提高性能。

但是,每当我们部署新版本时,我们都会接到用户的电话,说页面看起来很凌乱并且充满了 javascript 错误。事实证明,他们的浏览器没有重新下载更改后的 .css 和 .js 文件。 Ctrl-F5 总是修复它。

有没有办法在升级部署后强制重新下载,而不将其设置为不缓存(从而减慢我们的应用程序的速度)?

我发现了这个(每次部署手动更改对每个文件的引用): How do I force a given file to expire in the cache?

还有这个(同样的事情,但每次页面加载时都会计算校验和): Needed advice on how to implement js/css versioning

但肯定有比这更合理的解决方案...?

【问题讨论】:

您达到的解决方案是什么?可以发帖吗? 【参考方案1】:

在文件中设置版本号对我们很有效:

<script type="text/javascript" src="somefile.js?v=1.0"></script>

只要您在每次“发布”时更改该版本号,浏览器就会认为它是一个新文件。

您可以通过在全局文件(如配置文件或其他文件)中简单地使用版本号,然后在您希望的每个脚本/css 标记上设置变量来做到这一点。

【讨论】:

这可行,但我有几个不同的母版页,其中包含十几个这样的链接,这似乎是一项相当多的工作,而且在所有其他部署任务中很容易忘记。肯定有更好的方法吗? ASP.NET 或 IIS 中的设置更改...? IE 不会完全忽略的 http 标头...? 不幸的是,我不知道任何其他像这样工作的解决方案。您希望它缓存,但仅在您更新时。如果该文件没有带有它的版本,那么您无能为力。我想你可以有一个在初始加载后设置的 cookie,如果存在,可以绕过无缓存头或类似的东西,但如果你设置正确,每个部署应该很容易按照我上面提到的那样做。 我正在工作的一个 Java 应用程序设置为读取从我们的 SVN 修订版中检索到的变量,因此一旦我们部署,它总是有一个新的版本号,我们不需要进行任何更改。 当我实施这个解决方案时,我发现 Chrome 每次刷新时都会加载我的 CSS 的新版本,即使版本号从未改变。不应该是换了号码才获取最新版本吗? 听起来像是 Chrome 中的设置或错误。它应该使用版本号缓存每个脚本。【参考方案2】:

最好的方法是在文件名中使用版本控制。如果您正在使用 SVN、Microsoft Team Foundation 等代码版本,那么您可以使用最后一个签入号作为文件名的后缀,例如,假设当前签入号是 1321(或者您也可以使用时间戳 yyyy-mm-dd-hh-mm2015-01-15-17-15)

因此 somefile.js 将变为 somefile_v1321.js 要么 somefile.js 将变为 somefile_v2015-01-15-17-15.js

现在您会想知道这里发生了如此多的文件名更改。答案是,如果你的发布非常频繁,那么考虑使用像 Ant 脚本这样的脚本语言,它可以更改发布文件中的 JS 和 CSS 导入文件名。

每次进行新的部署,资源都会有一个新的统一路径,这对浏览器来说是唯一的,所以它会重新加载。

【讨论】:

以上是关于强制客户端浏览器重新下载我们的 asp.net Web 应用程序的 .css 和 .js 文件的优雅方式(不完全禁用缓存)的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET - IIS 7 - DotNetNuke - 如何强制浏览器重新加载站点的 CSS?

如何强制浏览器下载 xml 文件?

ASP.NET AJAX

在 ASP.NET MVC 中返回文件以查看/下载

Asp.net MVC 5 视图在使用 F5 重新加载页面之前不呈现

如何对asp.net mvc 4中的select2字段进行强制字段验证