【问题标题】:Is there a way to update asp.net mvc bundle contents dynamically at run-time?有没有办法在运行时动态更新 asp.net mvc 包内容?
【发布时间】:2015-02-20 16:28:24
【问题描述】:

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

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

现在,有没有办法完成以下工作

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

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

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

【问题讨论】:

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

标签: asp.net-mvc asp.net-mvc-4 bundling-and-minification web-optimization asp.net-bundling


【解决方案1】:

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

正如问题的 cmets 中所讨论的,捆绑包被定义为 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"])

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多