【问题标题】:How can I dynamically add bundles after Application_Start has occurred?Application_Start 发生后如何动态添加捆绑包?
【发布时间】:2013-03-10 21:44:04
【问题描述】:

我有一个 asp.net MVC4 Web 应用程序,它为主题使用样式捆绑。我有一个像这样的物理主题文件夹结构......

 Themes\
     _Base\
     Theme1\
     Theme2\
     ...\

每个主题文件夹中都有任意数量的 LESS 文件。在我的BundleConfig.RegisterBundles 方法中,我有一些逻辑循环遍历每个主题文件夹并为每个主题文件夹创建一个包。 System.Web.Optimization 的捆绑机制将监视 现有 捆绑包中的文件和文件夹中的更改并刷新捆绑包缓存,这可以正常工作。

然而,我需要一种将新主题文件夹(即Theme3\)复制到我的Themes 根文件夹中的方法,并且应用程序无需先重新启动即可识别这些文件夹。我尝试创建一个“虚拟”包,它引用每个文件夹中的所有文件...

var changeTracking = new StyleBundle(BUNDLE_ROOT);
changeTracking.Transforms.Clear();
changeTracking.IncludeDirectory(THEME_ROOT, "*.less", true);
changeTracking.Transforms.Add(new LessTransform());
changeTracking.Transforms.Add(new CssMinify());
bundles.Add(changeTracking);

...但这似乎没有帮助。当我拨打Theme3\ 时,它不会触发对BundleConfig.RegisterBundles 的另一个呼叫。我还是要做一个IISRESET,回收应用程序池等等,才能让新的主题被识别。

有什么方法可以在 Application_Start 发生后动态添加捆绑包?

【问题讨论】:

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


    【解决方案1】:

    这不是我们明确尝试支持的,我们希望所有捆绑包都在应用启动之前注册。否则,这将在 webfarm 场景中导致问题,其中某些捆绑包并不存在于所有服务器上,从而导致 404。

    捆绑缓存依赖项将负责从 ASP.NET 缓存中刷新旧响应,但它不会触发对 RegisterBundles 的另一个调用,该调用是从您的 global.asax 调用的,并且只会在像您这样的应用程序回收期间调用已经提到了。

    【讨论】:

    • 谢谢郝。有什么办法让我手动刷新缓存(可能类似于stackoverflow.com/questions/12317391/…)并在应用程序运行时强制它重建捆绑包?
    • 好吧,您可以通过对 Bundle 上的任何这些属性(如 Orderer/Builder/EnableFileExtensionReplacements)执行无操作集来做到这一点,基本上只需执行 bundle.Orderer = bundle.Orderer,这将导致我认为是同花顺。
    • 也许我应该说“调用 RegisterBundles”而不是“重建捆绑包”。我希望添加新的,而不是仅仅刷新现有包中的文件。
    • 好吧,没有什么可以阻止您在 AppStart 之后直接修改 BundleTable.Bundles 集合,如果您只有一台服务器,这应该没问题,一切都会正常工作。只需在需要时添加捆绑包,如果您只想注册新捆绑包,则无需调用 RegisterBundles
    • 谢谢郝。我会试一试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    相关资源
    最近更新 更多