强制浏览器重新加载缓存的CSS / JS文件。 (Asp.net MVC)

时间:2017-06-18 11:26:00

标签: c# caching browser-cache


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

在ASP.net MVC中

如果文件变为Bundle,则由Optimization框架处理。添加到文件链接的版本,如果捆绑包的文件发生更改,则会生成新令牌。请遵循以下代码:

例如,

,js文件名为:datatables

当你把它放在一个同名的包中时,你会看到

datatables?v=anY9_bo7KitrGnXQr8ITP3ylmhQe9NDzSjgLpLQWQFE1

作为文件名。  更改datatables并再次在浏览器中查看该文件的名称,肯定会更改:

datatables?v=r8yhQBxKyDgrOGyqr1ndtdG92Ije09nqTY7yogrOSTk1

- 但是,如果我们的文件不在Bundle中,我们该怎么办? - 是强制浏览器刷新缓存的方法吗? (评论它)。

2 个答案:

答案 0 :(得分:4)

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

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

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

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

using System;
using System.IO;
using System.Web;
using System.Web.Mvc;
public static class UrlHelperExtensions
{
    public static string ContentWithVersion(this UrlHelper urlHelper, string path)
    {
        if (urlHelper == null)
            throw new ArgumentNullException(nameof(urlHelper));
        var result = urlHelper.Content(path);
        var file = HttpContext.Current.Server.MapPath(path);
        if (File.Exists(file))
            result += $"?v={File.GetLastWriteTime(file).ToString("yyyyMMddHHmmss")}";
        return result;
    }
}

答案 1 :(得分:1)

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

data = [
    ('2015-09-25 00:46', '71.925000'),
    ('2015-09-25 00:47', '71.625000'),
    ('2015-09-25 00:48', '71.333333'),
    ('2015-09-25 00:49', '64.571429'),
    ('2015-09-25 00:50', '72.285714'),
]

index, values = zip(*data)

frame = pd.DataFrame({
    'values': values
}, index=pd.DatetimeIndex(index))

print(frame.index.minute)

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

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

datatables?v=1

最好的方法是:

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

datatables?v=Guid.NewGuid()

通过这种方式,当您更改文件时,<script src="~/scripts/main.js?v=@File.GetLastWriteTime(Server.MapPath("/scripts/main.js")).ToString("yyyyMMddHHmmss")"></script> 也随之更改,因此文件的版本也会更改,并且在下次打开浏览器时,它会检测到一个新文件并提取它。