更新:以前的版本在 Azure 上不起作用,我在下面进行了简化和更正。 (注意,要在 IIS Express 的开发模式下工作,您需要安装 Microsoft http://www.iis.net/downloads/microsoft/url-rewrite 的 URL Rewrite 2.0 - 它使用 WebPi 安装程序,请确保先关闭 Visual Studio)
如果您想更改文件的实际名称,而不是附加查询字符串(某些代理/浏览器会忽略静态文件),您可以按照以下步骤操作:(我知道这是一篇旧帖子,但我在开发解决方案时遇到了它:
怎么做: 每次构建项目时自动增加程序集版本,并将该数字用于特定资源上的路由静态文件喜欢保持清爽。 (所以 something.js 包含在 something.v1234.js 中,每次构建项目时 1234 都会自动更改) - 我还添加了一些额外的功能,以确保在生产中使用 .min.js 文件并使用 regular.js 文件调试时(我正在使用 WebGrease 来自动化缩小过程)这个解决方案的一个好处是它可以在本地/开发模式以及生产模式下工作。 (我使用的是 Visual Studio 2015 / Net 4.6,但我相信这也适用于早期版本。
第 1 步:在构建时启用程序集的自动增量
在 AssemblyInfo.cs 文件(在项目的“属性”部分下找到)更改以下几行:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
到
[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyFileVersion("1.0.0.0")]
第 2 步:在 web.config 中为具有嵌入式版本 slug 的文件设置 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(在项目的根目录中找到)中,将以下代码添加到受保护的 void Application_Start()(在 Register 行之后)
// setup application variables to write versions in razor (including .min extension when not debugging)
string addMin = ".min";
if (System.Diagnostics.Debugger.IsAttached) { addMin = ""; } // don't use minified files when executing locally
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";
第 4 步:使用我们在 Global.asax.cs 中设置的应用程序变量更改 Razor 视图中的 src 链接
@HttpContext.Current.Application["CSSVer"]
@HttpContext.Current.Application["JSVer"]
例如,在我的 _Layout.cshtml 中,在我的 head 部分,我有以下样式表代码块:
<!-- 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 中的代码处理
同样,(也在 _Layout.cs 中)在我的 javascript 部分:我有以下代码:
<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 手动创建的所有 3rd 方库的捆绑包。如果我添加或更改捆绑包中的任何文件(这种情况很少见),然后我手动将文件重命名为 all3bnd101.min.js、all3bnd102.min.js 等...此文件与重写处理程序不匹配,所以将一直缓存在客户端浏览器上,直到您手动重新捆绑/更改名称。
第二个文件是 ui.js(将被写为 ui.v12345123.js 或 ui.v12345123.min.js,具体取决于您是否在调试模式下运行)这将被处理/重写。 (你可以在 Global.asax.cs 的 Application_OnBeginRequest 中设置一个断点来观察它的工作)
对此的完整讨论:Simplified Auto-Versioning of Javascript / CSS in ASP.NET MVC 5 to stop caching issues (works in Azure and Locally) With or Without URL Rewrite(包括一种无需 URL 重写的方法)