我已经阅读了许多关于如何自动版本的CSS / JS文件的文章 – 但是没有一个提供了一个优雅的方式来做到这一点在ASP.NET MVC。
这个链接 – What is an elegant way to force browsers to reload cached CSS/JS files? – 为Apache提供了一个解决方案 – 但我有点困惑,这可以通过ASP.NET MVC实现?
任何人都可以提供一些建议,如何在IIS7和ASP.NET MVC上这样做,以便CSS / JS文件自动在URL中插入版本号,而不改变文件的位置?
<link rel="stylesheet" href="/css/structure.1194900443.css" type="text/css" /> <script type="text/javascript" src="/scripts/prototype.1197993206.js"></script>
谢谢
解决方法
当面对这个问题时,我在UrlHelper的Content方法中写了一系列包装函数:
编辑:
在下面的意见讨论之后,我更新了这段代码:
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}",_version)); } public static string Stylesheet(this UrlHelper helper,string fileName) { return helper.Content(string.Format("{0}/v{2}/assets/css/{1}",_version)); } public static string Script(this UrlHelper helper,string fileName) { return helper.Content(string.Format("{0}/v{2}/assets/js/{1}",_version)); } }
结合以下重写规则使用这些功能应该可以工作:
<rewrite> <rules> <rule name="Rewrite assets"> <match url="^v(.*?)/assets/(.*?)" /> <action type="Rewrite" url="/assets/{R:2}" /> </rule> </rules> </rewrite>
This article讨论如何在IIS7上创建重写规则。
此代码使用当前程序集的版本号作为它发出的文件路径上的查询字符串参数。当我对网站进行更新并且版本号递增时,文件上的querystring参数也是如此,因此用户代理将重新下载该文件。