我希望通过 <script> 标记引用的 JavaScript、我的 css 和各种图形文件缓存在用户浏览器上,以用于我的网站的给定版本。但是,当我发布对文件的更新时,我想确保新内容(Javascript、css、图形等)将在用户的机器上更新。
在研究这个问题时,我遇到了许多可能的解决方案:
- 为缓存控制和过期等内容调整 http 标头
- 将唯一的查询字符串附加到每个资源请求
- 在所请求资源的路径(或文件名)中包含版本号
我对选项 1 的担忧(除了不知道如何为某些内容类型实现它)是,如果浏览器和 IIS 之间有中间代理,那么中间代理可能不尊重 http 标头,并且内容将被缓存在浏览器和代理。
我对选项 2 的关注有两个方面。一方面,如果我只使用随机数或时间戳,那么浏览器每次都会请求新资源,即使内容没有更改(版本之间没有更改)也会绕过本地缓存。解决此问题的方法是使用资源文件的时间戳或文件的哈希;这只有在新版本出现时才会改变。然而,这导致了我的第二个担忧:我知道一些网络代理从不缓存任何带有查询字符串的东西,默认情况下(http://stackoverflow.com/questions/5541340/how-can-i-prevent-javascript-caching-查询字符串方法不工作)。虽然这可能是可定制的,但我不想依赖管理员更改默认设置,以获得缓存的性能优势。
选项 3 似乎是最佳选择,但对于 ASP .NET MVC(当前使用 ASP .NET MVC 3),我不知道如何以实用的方式实现它。手动,我可以进入每个链接到图形、css 或外部 javascript 文件的文件,并更改路径以包含每个版本的不同版本号,但显然这很乏味且容易出错。
那么我的问题是:
1)是否有任何其他策略可以避免缓存(对于给定版本)我应该考虑和
2) 假设我使用选项 3(包括资源路径中的版本号),我如何在 ASP .NET MVC 应用程序中以一种易于维护的方式实现这一点?
谢谢,
巴黎圣母院