我读过很多关于如何自动设置你的CSS/JS文件版本的文章--但是这些文章都没有提供一个在ASP.NET MVC中做这件事的优雅方法。
这个链接-- How to force browser to reload cached CSS/JS files? --为Apache提供了一个解决方案--但是我对如何通过ASP.NET MVC实现这一点感到有点困惑。
谁能提供一些建议,如何在IIS7和CSS MVC上做到这一点-使ASP.NET /JS文件自动在网址中插入一个版本号,而不改变文件的位置?
也就是说,所以链接出来链接这个等假设使用URL重写或?
<link rel="stylesheet" href="/css/structure.1194900443.css" type="text/css" />
<script type="text/javascript" src="/scripts/prototype.1197993206.js"></script>
Thx
发布于 2011-01-30 14:13:30
当遇到这个问题时,我围绕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}", 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>
This article讨论了如何在IIS7上创建重写规则。
此代码使用当前程序集的版本号作为它发出的文件路径上的查询字符串参数。当我更新站点并且内部版本号递增时,文件上的querystring参数也会递增,因此用户代理将重新下载该文件。
发布于 2013-08-03 21:43:12
我认为下一个具有高级选项(调试/发布模式、版本)的解决方案:
通过以下方式包含的Js或Css文件:
<script type="text/javascript" src="Scripts/exampleScript<%=Global.JsPostfix%>" />
<link rel="stylesheet" type="text/css" href="Css/exampleCss<%=Global.CssPostfix%>" />
在Global.asax中,Global.JsPostfix和Global.CssPostfix的计算方法如下:
protected void Application_Start(object sender, EventArgs e)
{
...
string jsVersion = ConfigurationManager.AppSettings["JsVersion"];
bool updateEveryAppStart = Convert.ToBoolean(ConfigurationManager.AppSettings["UpdateJsEveryAppStart"]);
int buildNumber = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.Revision;
JsPostfix = "";
#if !DEBUG
JsPostfix += ".min";
#endif
JsPostfix += ".js?" + jsVersion + "_" + buildNumber;
if (updateEveryAppStart)
{
Random rand = new Random();
JsPosfix += "_" + rand.Next();
}
...
}
https://stackoverflow.com/questions/4841455
复制相似问题