有没有办法在运行时动态更新asp.net mvc包内容?

Arg*_*a C 8 asp.net-mvc web-optimization asp.net-mvc-4 bundling-and-minification asp.net-bundling

我是我的应用程序的ASP.NET MVC v4,我正在使用Web优化功能(脚本和样式的捆绑和缩小).

现在,我理解的是(如果错误请纠正我),优化框架将在编译时查看包含的文件并进行配置.它将根据内容创建版本号(v = something).每次内容更改时,它都会重新创建版本哈希,客户端将获得更新的文件.

现在,有没有办法完成以下任务

[1]更新我服务器中js文件中的内容,并将更新后的内容提供给客户端,而无需重新构建和重新启动应用程序(我不是在这里更改捆绑配置,只是更新脚本中的文件内容)?

[2]更新脚本配置本身(例如,向捆绑包添加新脚本),并将其提供给客户端,而无需重新编译和重新启动应用程序?或者,至少没有重新编译?(我知道,通常我们在cs文件中定义包,但想知道是否有出路!)

[3]有没有办法使用我自己的版本号(比如来自配置文件,v = myCustomScriptVersion)而不是自动生成的版本哈希?

Arg*_*a C 9

这有点晚了,但我只是在这里分享我自己的经验.

正如问题的评论中所讨论的,bundle被定义为cs文件的一部分(通常是App_Start中的BundleConfig.cs).因此,bundle在编译时定义,在应用程序启动时,它们将被添加到集合中并变得可用.

现在,有趣的一点.在运行时,优化框架查看包含的文件并创建内容的哈希值,并将其作为版本查询字符串附加到捆绑包请求.因此,当调用bundle时,生成的uri就像下面的那样.

http://example.com/Bundles/MyBundledScripts?v=ILpm9GTTPShzteCf85dcR4x0msPpku-QRNlggE42QN81

此版本号v = ...是完全动态的.如果更改了包中的任何文件内容,则将重新生成此版本,否则将保持相同.

现在回答问题,

[1]这是由框架自动完成的,不需要为此做任何额外的事情.每次更改文件内容时,都会生成新的版本号,客户端将获得更新的脚本.

[2]不可能.如果更改包中包含的文件,则必须重新编译.

[3]是的,它可以使用.可以添加自定义版本号,如下所示.

@Scripts.Render("~/Bundles/MyBundledScripts?v=" + ConfigurationManager.AppSettings["ScriptVersion"])
Run Code Online (Sandbox Code Playgroud)

但是小心!这将删除基于文件内容的自动版本控制.

此外,如果同一文件的多个版本可用且我们总是希望包含可用的最新版本,则可以通过在下面的捆绑配置中包含{version}通配符来轻松实现.

bundles.Add(new ScriptBundle("~/Bundles/MyBundledScripts")
            .Include(
                "~/Scripts/Vendor/someScript-{version}.js"
            ));
Run Code Online (Sandbox Code Playgroud)

因此,如果/Scripts/Vendor文件夹中有2个脚本someScript-2.3.js someScript-3.4.js

然后文件someScript-3.4.js(更高版本)将自动包含在内.当一个新文件someScript-4.0.js被添加到该文件夹​​时,它将被提供给客户端而无需重新编译/重新启动.