在ASP.NET MVC中为CSS / JS文件自动版本化如何实现?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (79)

我已经阅读了很多关于如何自动版本化CSS / JS文件的文章 - 但是这些文章都没有提供一个在ASP.NET MVC中完成此操作的优雅方法。

任何人都可以提供一些建议,如何在IIS7和ASP.NET MVC上做到这一点 - 以便CSS / JS文件自动在URL中插入版本号而不更改文件的位置?

也就是说,所以链接出来链接等,大概使用URL重写或?

<link rel="stylesheet" href="/css/structure.1194900443.css" type="text/css" />
<script type="text/javascript" src="/scripts/prototype.1197993206.js"></script>
提问于
用户回答回答于

当面对这个问题,我写了一系列的围绕着包装功能UrlHelperContent方法:

在下面的评论中讨论后,我更新了这段代码:

public static class UrlHelperExtensions
{
    private readonly static string _version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();

    private static string GetAssetsRoot()
    {
        string root = ConfigurationManager.AppSettings["AssetsRoot"];
        return root.IsNullOrEmpty() ? "~" : root;
    }

    public static string Image(this UrlHelper helper, string fileName)
    {
        return helper.Content(string.Format("{0}/v{2}/assets/img/{1}", GetAssetsRoot(), fileName, _version));
    }

    public static string Asset(this UrlHelper helper, string fileName)
    {
        return helper.Content(string.Format("{0}/v{2}/assets/{1}", GetAssetsRoot(), fileName, _version));
    }

    public static string Stylesheet(this UrlHelper helper, string fileName)
    {
        return helper.Content(string.Format("{0}/v{2}/assets/css/{1}", GetAssetsRoot(), fileName, _version));
    }

    public static string Script(this UrlHelper helper, string fileName)
    {
        return helper.Content(string.Format("{0}/v{2}/assets/js/{1}", GetAssetsRoot(), fileName, _version));
    }
}

结合以下rewrite规则使用这些功能应该可以工作:

<rewrite>
  <rules>
    <rule name="Rewrite assets">
      <match url="^v(.*?)/assets/(.*?)" />
      <action type="Rewrite" url="/assets/{R:2}" />
    </rule>
  </rules>
</rewrite>

本文讨论如何在IIS7上创建重写规则。

此代码使用当前程序集的版本号作为它发出的文件路径上的查询字符串参数。当我对站点进行更新并且内部版本号增加时,文件上的查询字符串参数也会增加,因此用户代理将重新下载该文件。

用户回答回答于

我通常追加一个假的查询字符串到我的资源文件..即

<link rel="stylesheet" href="/css/structure.css?v=1194900443" type="text/css" />
<script type="text/javascript" src="/scripts/prototype.js?v=1197993206"></script>

它不需要任何url助手,并且不管在后台运行什么。说实话,我还没有完全测试过这种方法,但我发现它总是修复人们遇到的任何资源缓存问题。

可能必须v=手动更新,但将版本参数追加到某个配置文件中的资源并不难。

扫码关注云+社区

领取腾讯云代金券