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

C# 如何强制浏览器使用版本控制重新加载缓存的静态文件?,c#,asp.net,asp.net-mvc,caching,browser-cache,C#,Asp.net,Asp.net Mvc,Caching,Browser Cache,部署新版本的网站后,浏览器将从旧网页的缓存加载所有内容,直到完成硬强制刷新 在ASP.NET MVC中,如果文件成为捆绑包,则由优化框架处理。添加到文件链接的版本,如果捆绑包的文件发生更改,则生成新的令牌。请遵循以下代码: <script src="~/scripts/main.js?v=@File.GetLastWriteTime(Server.MapPath("/scripts/main.js")).ToString("yyyyMMddHHmmss")"></script&

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

ASP.NET MVC
中,如果文件成为捆绑包,则由优化框架处理。添加到文件链接的版本,如果捆绑包的文件发生更改,则生成新的令牌。请遵循以下代码:

<script src="~/scripts/main.js?v=@File.GetLastWriteTime(Server.MapPath("/scripts/main.js")).ToString("yyyyMMddHHmmss")"></script>
例如,
js
文件名是:
datatables

当您将其放入具有相同名称的包中时,您将看到

datatables?v=anY9_bo7KitrGnXQr8ITP3ylmhQe9NDzSjgLpLQWQFE1
作为文件名。 更改
datatables
并在浏览器中再次查看文件名,它肯定会更改:

datatables?v=r8yhQBxKyDgrOGyqr1ndtdG92Ije09nqTY7yogrOSTk1
但有两个问题:

  • 如果我们的文件不在捆绑包中,我们能做什么
  • 是一种强制浏览器刷新缓存的方法吗

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

datatables?v=1
我们可以处理文件的版本,这意味着每次我们更改文件时,也要更改文件的版本。但这不是一个合适的方式

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

datatables?v=Guid.NewGuid()
最后一种最好的方法是:

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

<script src="~/scripts/main.js?v=@File.GetLastWriteTime(Server.MapPath("/scripts/main.js")).ToString("yyyyMMddHHmmss")"></script>


这样,当您更改文件时,
LastWriteTime
也会更改,因此文件的版本会更改,在下一次打开浏览器时,它会检测到一个新文件并获取它。

假设您出于某种原因无法使用捆绑,原始海报建议的解决方案就足够了,不过,最好将逻辑放在

它使代码可测试,有助于在不更改
.cshtml
的情况下更改逻辑,也有助于不重复文件名两次。这样,您就可以拥有更清晰的代码:

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

最好将逻辑放在helper方法中,因为函数具有所有好处,包括:使代码可测试,避免重复文件路径两次,还可以在不更改此aspx/cshtml文件的情况下更改逻辑。