如何在Application_Start发生后动态添加包?

rac*_*cow 7 asp.net asp.net-mvc-4 bundling-and-minification asp.net-optimization

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

 Themes\
     _Base\
     Theme1\
     Theme2\
     ...\
Run Code Online (Sandbox Code Playgroud)

每个主题文件夹中都包含任意数量的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);
Run Code Online (Sandbox Code Playgroud)

......但这似乎没有帮助.当我做的时候Theme3\,它不会触发另一次调用BundleConfig.RegisterBundles.我仍然需要执行IISRESET,回收应用程序池等,以便识别新主题.

有没有什么办法可以在Application_Start发生后动态添加包?

Hao*_*ung 4

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

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

  • 好吧,没有什么可以阻止您在 AppStart 之后直接修改 BundleTable.Bundles 集合,如果您只有一台服务器,这应该没问题,一切都会正常工作。只需在需要时添加捆绑包即可,如果您只想注册新捆绑包,则无需调用 RegisterBundles (2认同)