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

Asp.net mvc 有没有办法在运行时动态更新asp.net mvc捆绑包内容?,asp.net-mvc,asp.net-mvc-4,bundling-and-minification,web-optimization,asp.net-bundling,Asp.net Mvc,Asp.net Mvc 4,Bundling And Minification,Web Optimization,Asp.net Bundling,我的应用程序是ASP.NETMVCV4,我正在使用web优化功能(脚本和样式的捆绑和缩小) 现在,我的理解是(如果错误,请纠正我),优化框架将在编译时查看包含的文件并对其进行配置。它将根据内容创建一个版本号(v=something)。每次内容更改时,它都会重新创建版本哈希,客户端将获得更新的文件 现在,有没有办法做到以下几点 [1] 在我的服务器中更新js文件中的某些内容,并将更新后的内容提供给客户端,而无需重新构建和启动应用程序(这里我没有更改bundle配置,只是更新脚本中的文件内容) [2

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

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

现在,有没有办法做到以下几点

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

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


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

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

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

现在,有趣的一点。在运行时,优化框架查看包含的文件并创建内容的散列,并将其作为版本查询字符串附加到bundle请求中。因此,当bundle被调用时,生成的uri如下所示

此版本号v=。。。它是完全动态的。如果捆绑包中的任何文件内容发生更改,将重新生成此版本,否则将保持不变

现在回答问题,

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

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

[3] 是的,可以用。自定义版本号可按如下方式添加

@Scripts.Render("~/Bundles/MyBundledScripts?v=" + ConfigurationManager.AppSettings["ScriptVersion"])
但是要小心!这将删除基于文件内容的自动版本控制

此外,如果同一文件有多个版本可用,并且我们总是希望包含可用的最新版本,那么可以通过在bundle配置中包含{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
添加到文件夹中时,该文件将被提供给客户端,而无需重新编译/重新启动。

在编译过程中未配置捆绑包,而是在应用程序启动时在运行时配置。@danludwig,捆绑包内容确实是在编译时定义的。@haim770它们是在编译时定义的,但它们是在运行时配置的。AppApplication\u Start将调用BundleConfig.RegisterBundles,这会将捆绑添加到集合中。这段代码在运行时运行。也许我有点困惑。无论如何,我已经更新了我的问题,我的目的是在不重新编译和启动应用程序的情况下获得更新的脚本。@ArghyaC是的,这是可能的。你必须有一些东西来清除GlobalFilters.Filters并重新运行你的包注册码。