更新:之前的版本在Azure上无法运行,下面简化并更正了。(注意,在使用IIS Express的开发模式中使其正常工作,你需要从Microsoft安装URL Rewrite 2.0http://www.iis.net/downloads/microsoft/url-rewrite - 它使用WebPi安装程序,请确保先关闭Visual Studio)
如果您想要更改实际文件的名称,而不是附加查询字符串(某些代理/浏览器会忽略静态文件的查询字符串),则可以按照以下步骤操作:(我知道这是一个老帖子,但我在开发解决方案时遇到了它):
如何做:每次构建项目时自动递增程序集版本,并将该数字用于要保持刷新的特定资源的路由静态文件(因此,something.js将被包括为something.v1234.js,并且1234会在每次构建项目时自动更改)- 我还添加了一些额外的功能,以确保在生产中使用.min.js文件,在调试时使用regular.js文件(我正在使用WebGrease来自动执行缩小过程)这个解决方案的一个好处是它既适用于本地/ 开发模式,也适用于生产环境。(我使用的是Visual Studio 2015 / Net 4.6,但我相信这也适用于早期版本)。
第一步:在构建时启用程序集自动递增
在AssemblyInfo.cs文件(在项目的“属性”部分中找到)中更改以下行:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
to
[assembly: AssemblyVersion("1.0.*")]
步骤2:为包含嵌入版本标识的文件在web.config中设置url重写(请参见步骤3)
在web.config文件(项目的主要配置文件)中,在<system.webServer>
部分添加以下规则。我直接将其放在了</httpProtocol>
结束标签之后。
<rewrite>
<rules>
<rule name="static-autoversion">
<match url="^(.*)([.]v[0-9]+)([.](js|css))$" />
<action type="Rewrite" url="{R:1}{R:3}" />
</rule>
<rule name="static-autoversion-min">
<match url="^(.*)([.]v[0-9]+)([.]min[.](js|css))$" />
<action type="Rewrite" url="{R:1}{R:3}" />
</rule>
</rules>
</rewrite>
步骤3:设置应用变量来读取当前程序集版本并创建js和css文件中的版本slug。
在Global.asax.cs文件(位于项目根目录中)中,将以下代码添加到protected void Application_Start()方法中(在注册行之后):
string addMin = ".min";
if (System.Diagnostics.Debugger.IsAttached) { addMin = ""; }
Application["JSVer"] = "v" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString().Replace('.','0') + addMin + ".js";
Application["CSSVer"] = "v" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString().Replace('.', '0') + addMin + ".css";
第四步:使用我们在Global.asax.cs中设置的应用程序变量更改Razor视图中的src链接。
@HttpContext.Current.Application["CSSVer"]
@HttpContext.Current.Application["JSVer"]
例如,在我的_Layout.cshtml文件中,头部区域有以下代码块用于样式表:
<!-- Load all stylesheets -->
<link rel='stylesheet' href='https://fontastic.s3.amazonaws.com/8NNKTYdfdJLQS3D4kHqhLT/icons.css' />
<link rel='stylesheet' href='/Content/css/main-small.@HttpContext.Current.Application["CSSVer"]' />
<link rel='stylesheet' media='(min-width: 700px)' href='/Content/css/medium.@HttpContext.Current.Application["CSSVer"]' />
<link rel='stylesheet' media='(min-width: 700px)' href='/Content/css/large.@HttpContext.Current.Application["CSSVer"]' />
@RenderSection("PageCSS", required: false)
需要注意的有两点:1)文件没有扩展名。2)也没有.min。这两个问题都由Global.asax.cs中的代码处理。
同样,在我的javascript部分中(也在_Layout.cs中),我有以下代码:
<script src="~/Scripts/all3bnd100.min.js" type="text/javascript"></script>
<script src="~/Scripts/ui.@HttpContext.Current.Application["JSVer"]" type="text/javascript"></script>
@RenderSection("scripts", required: false)
第一个文件是我手动使用WebGrease创建的所有第三方库的捆绑包。如果我添加或更改了捆绑包中的任何文件(这很少见),那么我会手动将文件重命名为all3bnd101.min.js、all3bnd102.min.js等等。此文件与重写处理程序不匹配,因此将在客户端浏览器上保留缓存,直到您手动重新捆绑/更改名称。
第二个文件是ui.js(根据您是否运行调试模式,将编写为ui.v12345123.js或ui.v12345123.min.js)。这将被处理/重写。(您可以在Global.asax.cs的Application_OnBeginRequest中设置断点以观察其工作)
有关详细讨论,请参见:
ASP.NET MVC 5中简化的自动版本控制以解决缓存问题(适用于Azure和本地环境),可使用或不使用URL重写(包括一种无需URL重写的方法)。