更新:以前的版本在 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() (在注册行之后)
// 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 手动创建的所有第 3 方库的捆绑包。如果我添加或更改捆绑包中的任何文件(这种情况很少见),然后我手动将文件重命名为 all3bnd101.min.js、all3bnd102.min.js 等...此文件与重写处理程序不匹配,所以将一直缓存在客户端浏览器上,直到您手动重新捆绑/更改名称。
第二个文件是 ui.js(将被写为 ui.v12345123.js 或 ui.v12345123.min.js 取决于您是否在调试模式下运行)这将被处理/重写。(你可以在 Global.asax.cs 的 Application_OnBeginRequest 中设置一个断点来观察它的工作)
对此的完整讨论:在 ASP.NET MVC 5 中简化 Javascript/CSS 的自动版本控制以停止缓存问题(在 Azure 和本地工作)有或没有 URL 重写 (包括一种没有 URL 重写的方法)