我想确保最新版本的 js 和 css 在客户端浏览器缓存中。我已关注此链接(http://blog.robvolk.com/2009/04/ensure-latest-javascript-css-in-browser.html?showComment=1354714427404#c5850523542624593865)
问题是我没有在每次构建时都获得新的哈希码。我什至尝试清理和重建它确实具有相同的哈希码。
如果有人能建议我如何处理浏览器缓存,我将不胜感激。
谢谢
我想确保最新版本的 js 和 css 在客户端浏览器缓存中。我已关注此链接(http://blog.robvolk.com/2009/04/ensure-latest-javascript-css-in-browser.html?showComment=1354714427404#c5850523542624593865)
问题是我没有在每次构建时都获得新的哈希码。我什至尝试清理和重建它确实具有相同的哈希码。
如果有人能建议我如何处理浏览器缓存,我将不胜感激。
谢谢
我建议使用脚本和样式表的捆绑和缩小。这是与 MVC 4 一起引入的一项新功能,但似乎有人能够使其与 MVC3 一起工作 - ASP.NET MVC4 在 ASP.NET MVC3 中捆绑
ASP.NET 优化使用与您的解决方案类似的方法 - 它将哈希附加到脚本/样式的 URL,但此哈希基于 js/css 文件的内容,而不是基于应用程序程序集的实例。
注意:Jef Claes 的博文使用 Microsoft.Web.Optimization 包,该包已被 Microsoft.AspNet.Web.Optimization 取代,但我相信它甚至可以与 Microsoft.AspNet.Web.Optimization 包一起使用。
更新:以前的版本在 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,但我相信这也适用于早期版本。
要实施,您可以按照以下步骤操作:(我知道这是一篇旧帖子,但我在开发解决方案时遇到了它):
怎么做: 每次构建项目时自动增加程序集版本,并将该数字用于您希望保持刷新的特定资源的路由静态文件。(所以 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 重写的方法)