7

Mam aplikację sieci web asp.net MVC4, która używa stylu powiązania dla motywów. Mam strukturę folderów tematycznych takich jak ...Jak mogę dynamicznie dodawać pakiety po wystąpieniu Application_Start?

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

Każdy folder tematów zawiera dowolną liczbę plików LESS. W mojej metodzie BundleConfig.RegisterBundles mam trochę logiki, która przechodzi przez każdy folder z motywami i tworzy pakiet dla każdego. Mechanizm sprzedaży pakietowej od System.Web.Optimization będzie śledzić zmiany w plikach i folderach, które są w pakietach i czyścić pamięć podręczną pakietów, co działa dobrze.

Co potrzebne jest jednak droga dla nowych folderach tematycznych (tj Theme3\) mają być skopiowane do mojego folderu głównego Themes, a aplikacja do rozpoznawania osób bez konieczności uprzedniego ponownego uruchomienia go. Próbowałem tworząc „atrapę” pakiet, który odwołuje wszystkie pliki w każdym folderze ...

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); 

... ale to nie wydaje się, aby pomóc. Kiedy robię Theme3\, nie wywołuje ono innego połączenia z BundleConfig.RegisterBundles. Nadal muszę wykonać IISRESET, odtworzyć pulę aplikacji itp., Aby nowy motyw został rozpoznany.

Czy istnieje sposób dynamicznego dodawania pakietów po wystąpieniu Application_Start?

Odpowiedz

4

Nie jest to coś, co wyraźnie staramy się wspierać, oczekuje się, że wszystkie pakiety zostaną zarejestrowane przed uruchomieniem aplikacji. W przeciwnym razie spowoduje to problemy w scenariuszach internetowych, w których niektóre pakiety nie istnieją na wszystkich twoich serwerach, co spowodowałoby 404.

Zależności od pamięci podręcznej pakietów zajmują się wypróżnianiem starych odpowiedzi z pamięci podręcznej ASP.NET, ale nie wywołają innego wywołania funkcji RegisterBundles, która jest wywoływana z pliku global.asax i będzie wywoływana tylko podczas odtwarzania aplikacji, np. wspomniałeś.

+0

Dzięki Hao. Czy istnieje sposób, aby ręcznie przepłukać pamięć podręczną (być może podobne do http://stackoverflow.com/questions/12317391/how-to-force-bundlecollection-to-flush-cached-script-bundles-in-mvc4) i zmusić go do odbudowy pakietów podczas działania aplikacji? – racingcow

+0

Cóż, możesz to zrobić, wykonując zestaw no-op na dowolnej z tych właściwości w Pakiecie, takich jak Zleceniodawca/Builder/EnableFileExtensionReplacements, po prostu po prostu wykonaj bundle.Orderer = bundle.Orderer i to spowoduje, że kolor będzie wyglądał tak. –

+0

Może powinienem był powiedzieć "call RegisterBundles" zamiast "odbudować pakiety". Szukam dodać nowe zamiast po prostu odświeżyć pliki w istniejących pakietów. – racingcow

Powiązane problemy