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

时间:2013-03-10 21:44:04

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

我有一个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发生后动态添加包?

1 个答案:

答案 0 :(得分:4)

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

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