强制浏览器在 asp.net 应用程序中获取最新的js和css文件

2022-08-30 05:42:55

某些浏览器缓存 js 和 css 文件,除非您强制刷新它们,否则无法刷新它们。最简单的方法是什么。

我刚刚实现了这个似乎有效的解决方案。

在页面上声明版本变量

  public string version { get; set; }

从 web.config 密钥获取版本号

 version = ConfigurationManager.AppSettings["versionNumber"];

在aspx页面中,像这样调用javascript和样式表

<script src="scripts/myjavascript.js?v=<%=version %>" type="text/javascript"></script>
<link href="styles/mystyle.css?v=<%=version %>" rel="stylesheet" type="text/css" />

因此,如果您在web.config中将版本从1.0设置为1.1,您的浏览器将下载最新的文件,希望能为您和您的用户节省一些挫败感。

是否有其他解决方案可以更好地工作,或者这会导致网站出现任何不可预见的问题?


答案 1

我通过将上次修改的时间戳作为查询参数附加到脚本中来解决此问题。

我使用扩展方法执行此操作,并在我的CSHTML文件中使用它。注意:此实现将时间戳缓存 1 分钟,因此我们不会过多地破坏磁盘。

以下是扩展方法:

public static class JavascriptExtension {
    public static MvcHtmlString IncludeVersionedJs(this HtmlHelper helper, string filename) {
        string version = GetVersion(helper, filename);
        return MvcHtmlString.Create("<script type='text/javascript' src='" + filename + version + "'></script>");
    }

    private static string GetVersion(this HtmlHelper helper, string filename)
    {
        var context = helper.ViewContext.RequestContext.HttpContext;

        if (context.Cache[filename] == null)
        {
            var physicalPath = context.Server.MapPath(filename);
            var version = $"?v={new System.IO.FileInfo(physicalPath).LastWriteTime.ToString("MMddHHmmss")}";
            context.Cache.Add(filename, version, null,
              DateTime.Now.AddMinutes(5), TimeSpan.Zero,
              CacheItemPriority.Normal, null);
            return version;
        }
        else
        {
            return context.Cache[filename] as string;
        }
    }
}

然后在CSHTML页面中:

 @Html.IncludeVersionedJs("/MyJavascriptFile.js")

在呈现的 HTML 中,这显示为:

 <script type='text/javascript' src='/MyJavascriptFile.js?20111129120000'></script>

答案 2

ASP.NET 核心 (MVC 6) 中,这可以通过标记助手开箱即用:asp-append-version

<script src="scripts/myjavascript.js" asp-append-version="true"></script>
<link href="styles/mystyle.css rel="stylesheet" asp-append-version="true" />