7

我有一個asp.net MVC4 web應用程序使用風格捆綁的主題。我有一個像這樣的物理主題文件夾結構...如何在Application_Start發生後動態添加包?

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發生後動態添加包?

回答

4

這不是我們明確想要支持的,期望的是所有的捆綁包都是在應用程序啓動之前註冊的。否則,這將導致webfarm場景中的問題,其中一些捆綁包不存在於所有服務器上,這會導致404s。

捆綁緩存依賴關係將處理從ASP.NET緩存中刷新舊響應,但它不會觸發對RegisterBundles的另一個調用,該調用從global.asax調用,並且只會在應用程序回收期間調用,如你提到過。

+0

謝謝郝。有什麼辦法讓我手動刷新緩存(可能類似於http://stackoverflow.com/questions/12317391/how-to-force-bundlecollection-to-flush-cached-script-bundles-in-mvc4)和迫使它在應用程序運行時重建捆綁包? – racingcow 2013-03-11 14:13:40

+0

那麼你可以通過對Bundle上的任何屬性執行no-op操作來完成此操作,比如Orderer/Builder/EnableFileExtensionReplacements,基本上只需要bundle.Orderer = bundle.Orderer,這會導致我想到的衝突。 – 2013-03-11 20:31:34

+0

也許我應該說「調用RegisterBundles」而不是「重建捆綁」。我正在尋找添加新的,而不是隻刷新現有的捆綁包中的文件。 – racingcow 2013-03-11 22:03:15

相關問題