如何强制浏览器使用版本控制重新加载缓存的静态文件?

问题描述 投票:7回答:2

部署网站的新版本后,浏览器将从旧网页的缓存中加载所有内容,直到完成强制刷新。

在ASP.net MVC中,如果文件成为Bundle,则由Optimization框架处理。版本添加到您的文件链接,并且如果捆绑文件中发生更改,则会生成一个新令牌。按照下面的代码:

例如,js文件名为:datatables

当您将其放入同名的包中时,会看到

datatables?v=anY9_bo7KitrGnXQr8ITP3ylmhQe9NDzSjgLpLQWQFE1

作为文件名。更改datatables,然后在浏览器中再次查看文件名,它肯定会更改:

datatables?v=r8yhQBxKyDgrOGyqr1ndtdG92Ije09nqTY7yogrOSTk1

-但是,如果文件不在捆绑包中怎么办?-是否可以强制浏览器刷新缓存?!

c# asp.net asp.net-mvc caching browser-cache
2个回答
6
投票

我们有一个解决方案,采用不同的实现方式。我们使用上面的解决方案。

datatables?v=1

我们可以处理文件的版本,这意味着每次更改文件时,也要更改文件的版本。但这不是合适的方法。

[另一种使用指南的方法,它也不适合,因为它每次获取文件时都不会从浏览器缓存中使用。

datatables?v=Guid.NewGuid()

最好的最后一种方法是:

发生文件更改时,也请更改版本。检查以下代码:

<script src="~/scripts/[email protected](Server.MapPath("/scripts/main.js")).ToString("yyyyMMddHHmmss")"></script>

通过这种方式,当您更改文件时,LastWriteTime也将更改,因此文件的版本也会更改,并且在下次打开浏览器时,它会检测到一个新文件并提取它。


3
投票

假设由于某种原因无法使用捆绑,原始发布者建议的解决方案就足够了,但是最好将逻辑放在辅助方法中。

它使代码可测试,它有助于在不更改.cshtml的情况下更改逻辑,并且还有助于避免重复两次文件名。然后,您可以得到一个更简洁的代码:

<script src="@Url.ContentWithVersion("~/scripts/main.js")"></script>

为此,您可以将ContentWithVersion扩展方法添加到现有的UrlHelper

UrlHelper
© www.soinside.com 2019 - 2024. All rights reserved.