我的应用程序是ASP.NET MVC v4,并且正在使用Web优化功能(脚本和样式的捆绑和最小化)。
现在,我了解的是(如果错了,请纠正我),优化框架将在编译时查看所包含的文件并对其进行配置。它将根据内容创建一个版本号(v = something)。每次内容更改时,它将重新创建版本哈希,客户端将获取更新的文件。
现在,有没有一种方法可以完成以下任务
[1]更新服务器中js文件中的内容,然后将更新后的内容提供给客户端,而无需重新构建和重新启动应用程序(我这里没有更改包配置,只是更新脚本中的文件内容)?
[2]更新脚本配置本身(例如,将新脚本添加到捆绑包中),然后将其提供给客户端,而无需重新编译和重新启动应用程序?还是至少没有重新编译? (我知道,通常我们在cs文件中定义包,但想知道是否有出路!)
[3]有没有办法使用我自己的版本号(例如,从配置文件v = myCustomScriptVersion中获取),而不是使用自动生成的版本哈希?
最佳答案
有点晚了,但是我只是在这里分享我自己的问题的经验。
正如问题注释中所讨论的,捆绑包被定义为一个cs文件的一部分(通常位于App_Start内部的BundleConfig.cs)。因此,捆绑软件是在编译时定义的,在应用程序启动时,它们将被添加到集合中并变得可用。
现在,有趣的一点。在运行时,优化框架将对包含的文件进行查找,并创建内容的哈希,然后将其作为版本查询字符串附加到捆绑包请求中。因此,当bundle被调用时,生成的uri如下所示。
http://example.com/Bundles/MyBundledScripts?v=ILpm9GTTPShzteCf85dcR4x0msPpku-QRNlggE42QN81
版本号v = ...是完全动态的。如果捆绑软件中的任何文件内容发生更改,则将重新生成该版本,否则将保持不变。
现在回答问题,
[1]这是由框架自动完成的,不需要为此做任何额外的事情。每次更改文件内容时,都会生成新的版本号,并且客户端将获取更新的脚本。
[2]不可能。如果捆绑包中包含的文件已更改,则必须重新编译。
[3]是的,可以使用。自定义版本号可以如下添加。
@Scripts.Render("~/Bundles/MyBundledScripts?v=" + ConfigurationManager.AppSettings["ScriptVersion"])
But Caution! This will remove the automatic versioning based on file contents.
另外,如果同一文件有多个版本可用,并且我们始终希望包含可用的最新版本,则可以通过在捆绑包配置中包含如下的{version}通配符来轻松实现。
bundles.Add(new ScriptBundle("~/Bundles/MyBundledScripts")
.Include(
"~/Scripts/Vendor/someScript-{version}.js"
));
因此,如果
/Scripts/Vendor
文件夹中有2个脚本someScript-2.3.js
someScript-3.4.js
然后,文件
someScript-3.4.js
(更高版本)将自动包含在内。当将新文件someScript-4.0.js
添加到该文件夹时,无需重新编译/重新启动即可将其提供给客户端。
关于asp.net-mvc - 有没有一种方法可以在运行时动态更新asp.net mvc bundle 内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27604960/