【问题标题】:In C#.NET, how to add version number to static file references, such as HTML and CSS?在 C#.NET 中,如何将版本号添加到静态文件引用,例如 HTML 和 CSS?
【发布时间】:2012-03-02 09:52:36
【问题描述】:

所以我正在使用 C#.NET 构建一个 Web 应用程序,并且想在文件引用中添加一个版本号。例如:

<script src="mysite/scripts/default.123.js"></script>

每次我修改网络应用程序中的文件,包括 cshtml、CSS、JS 或图像时,是否可以让版本号动态增加? 换句话说,我首先如何获取[或创建]版本号?有可能吗?

这是为了避免在客户端浏览器上缓存旧副本,尤其是在通过 XHR 提供服务时。由于我不想花时间解释的原因,我不要求替代方法,例如虚拟参数、无缓存元标记、日期时间戳、CDN 等。

我希望这个数字与被修改的文件的最新版本相对应 - 也许“构建版本”不是正确的词。正如 Kyle Trauberman 所说,assemblyversion 可能会起作用。然而,这是否能适应对静态资源(例如 HTML 或 CSS)的更改?有什么好的方法呢?

【问题讨论】:

    标签: c# .net html


    【解决方案1】:

    为避免缓存文件的旧版本,您可以将查询字符串附加到 url:

    <script src="mysite/scripts/default.js?v=123" />
    

    您传递给查询字符串的值是无关紧要的,因为您很可能会在服务器端忽略它。这可以防止浏览器缓存文件。 您可以将项目的程序集版本放在查询字符串中,以允许缓存文件,除非您更新项目。

    【讨论】:

    • @Josh 为什么投反对票?我回答了你在问题中强调的问题。请参阅我的答案中的粗体字。
    • 我对你的回答投了反对票,因为我看到的第一件事是你告诉我做一些我没有要求的事情。事实上,我明确表示我不想要其他方法。在重新阅读您答案的粗体部分时,assemblyversion 可能是我正在寻找的。这是否包括对 CSS 或 JS 资源文件所做的更改? (不仅仅是编译好的应用)
    • 它只会包含对已编译应用程序的更改,但如果您在 AssemblyInfo.cs 中使用自动递增版本(例如 1.0.*),那么该值将反映您在重建和部署。
    • 另外,您所说的“替代方法”是什么意思?这很模糊。
    • Arrrrggghh!我生气!大声笑 - 对不起......今天咖啡太多了:)同意含糊不清。在我们说话时更新我的​​问题。
    【解决方案2】:

    您可以将其作为查询字符串放在末尾,而不是将版本作为文件名的一部分,即:

    <script src="mysite/scripts/defualt.js?v=123" > </script>
    

    我相信大多数现代浏览器都尊重这一点,但我不知道它是否会在所有浏览器上 100% 有效。

    另外,顺便说一句,我意识到你的例子可能只是一个例子,但你不应该使用自关闭的外部脚本标签,它会导致大多数浏览器出现问题。

    【讨论】:

    • 请阅读我的帖子。我如何首先获得版本号?
    • 感谢关于自动关闭脚本 BTW 的说明。我只是一个例子 - 天哪,你们这些 stackoverflow 家伙不会让任何事情过去,是吗? :)
    【解决方案3】:

    为了解决这个问题,我采用了稍微不同的方法。我没有使用“版本号”,而是简单地附加最后修改日期。为了方便起见,我写了一个辅助方法:

    public static HtmlString Script<T>(this HtmlHelper<T> html, string path)
    {
        var file = html.ViewContext.HttpContext.Server.MapPath(path);
        DateTime lastModified = File.GetLastWriteTime(file);
    
        TagBuilder builder = new TagBuilder("script");
        builder.Attributes["src"] = path + "?modified=" + lastModified.ToString("yyyyMMddhhmmss");
        return new HtmlString(builder.ToString());
    }
    

    然后在您的视图中(不确定您是否使用 MVC,但两种情况下的解决方案都相似),您可以使用:

    @Html.Script("/Scripts/common.js")
    

    将输出:

    <script src="/Scripts/common.js?modified=20120129025804"></script>
    

    注意: Page Speed 对查询字符串的使用不满意。但是,我尝试将其更改为使用“/”,这导致 MVC 接管文件的路由,并阻止 IIS 处理它。不知道如何解决。

    【讨论】:

    • 看起来很有希望,但是我想把 # 放在这样的地方: common.123.js 。我想这只是一个字符串生成器,所以应该很容易做到。
    • @Josh 将版本放在文件名而不是查询字符串中的缺点是,当进行更新时,您需要将该文件的所有引用更新为新文件名,这可能既耗时又乏味。使用查询字符串,您不需要这样做。
    • @KyleTrauberman 好点,但如果所有引用都按上述方式实现,它们也将是完全动态的 :)
    • @Josh Kirk 使用文件上次修改日期的解决方案仅适用于更新静态文件而不是整个项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 2010-09-11
    • 2012-10-10
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    相关资源
    最近更新 更多