14

Używam nowych funkcji pakowania ASP.NET (przy użyciu wstępnego wydania System.Web.Optmization 1.0.0) w mojej aplikacji internetowej ASP.NET MVC 3.Nowe funkcje pakietowania ASP.NET - Jak mogę programowo odświeżyć określony pakiet?

Działa świetnie.

Jednak mamy pewne dynamiczne CSS/JS, które są przechowywane w bazie danych.

Chcę, aby ten dodatek został dodany do oddzielnego pakietu dla mojego podstawowego pakietu, powiedz "DynamicBundle". Wiem, jak to zrobić, a nie problem.

Teraz moje pytanie brzmi: kiedy ten CSS/JS zostanie zmieniony w bazie danych, pakiet ten musi zostać "odświeżony", aby zawartość tych plików ponownie została odczytana w pakiecie.

Zasadniczo potrzebuję programu ASP.NET do ponownego wygenerowania tego magicznego guid/string, który jest dołączany do adresu URL pakietu.

Idealnie chciałbym odświeżyć konkretny pakiet , a nie całą tabelę pakietów.

Czy istnieje sposób, aby to zrobić?

EDIT:

Ok Drugi problem, nie może dowiedzieć się, jak dodać dynamiczne CSS/JS do wiązki. bundle.AddFile pobiera wirtualną ścieżkę do pliku, ale nie jest to plik fizyczny, jest ciągiem znaków. Jak mam to zrobić? Na pewno nie muszę najpierw pisać ciągu do plików?

EDYTUJ 2: Postanowiłem więc nie łączyć moich dynamicznych treści. Dla 2 powodów:

  1. To tylko 1 plik, więc nie jestem zyskuje żadnej „pakowanie w wiązki” korzyści
  2. Bundling jest przeznaczony dla zawartości statycznej, to nie jest

Więc co mam done jest ręcznie skracane moje dynamiczne css/js w czasie wykonywania (raz, a następnie w pamięci podręcznej). W ten sposób mogę go łatwo odświeżyć, po prostu czyszcząc pamięć podręczną.

Mimo to, nadal jest to istotne pytanie (odświeżanie paczki), więc będę go pozostawić otwarte ..

+0

Wygląda na to, że niestandardowy moduł obsługi wypluwa dynamiczny JS/CSS może być dla Ciebie lepszy. Tak działają niektóre inne silniki, które generują JS w czasie pracy (na przykład Ajax.NET Pro robi to: http://ajaxpro.codeplex.com/). Alternatywnie można użyć prostej strony .aspx, która zwraca zawartość dynamiczną, i ustawia nagłówki pamięci podręcznej tak, aby nie były buforowane, aby klient żądał ich za każdym razem. – nothingisnecessary

Odpowiedz

5

That „że magia guid/string” to skrót od połączonych zawartości plików.

Możesz przetestować to w następującym przepływie pracy, który zakłada, że ​​masz mybundle.css. Jeśli używasz Skrzypek obserwować ruch, widać, że coś poprosić o hash jak

http://localhost:20206/mybundle.css?v=-6520265193368900210 

Teraz „dotknąć” jeden z plików w wiązce jak chcesz bez faktycznego zmieniania zawartości. Plik jest nowszy (LastModified/LastWrite jest nowszy), ale wartość mieszania pozostaje stała, ponieważ jest obliczana z tej samej połączonej zawartości. Można nawet dodać spacje do pliku, ponieważ zostałyby one zminimalizowane.

http://localhost:20206/mybundle.css?v=-6520265193368900210 

Następnie dokonaj zmiany.Być może ustawić granicę na 2px zamiast 1px. Wartość skrótu zmieni się teraz, ponieważ zawartość karmienia hasha zmieniła się.

http://localhost:20206/mybundle.css?v=-4725541136976015445 

Wreszcie, ustaw granicę z powrotem do tego, czym była (w powyższym przykładzie, z powrotem do 1 piksela). "Magiczna struna" w rzeczywistości nie jest przypadkowa ani magiczna. Zamiast tego wraca do pasującego jednokierunkowego skrótu obliczonego na podstawie zawartości.

http://localhost:20206/mybundle.css?v=-6520265193368900210 

Teraz możesz spać spokojnie, że skrót będzie aktualizowany tylko wtedy, gdy będzie potrzebny, bez ręcznej interwencji.

Co do drugiej części pytania,

gdy CSS/JS zmienia się w bazie danych, że pakiet musi być „odświeżony” tak, że zawartość tych plików są ponownie przeczytać w pakiecie .

Myślę, że po prostu odwracamy myślenie. Zamiast odświeżać pakiet, aby wywołać ponowne odczytanie, aktualizujemy pliki, aby uruchomić odświeżanie. Gdy ASP.NET zobaczy, że plik (e) się zmienił, to ponownie zrekombinuje zawartość i zaktualizuje hasz.

+1

Wiem, jak to zrobić, ale zapytałem, jak to zrobić ** programowo **. Sugerujesz "dotknięcie" pliku w aktualnym kodzie aplikacji? E.g StreamWriter rzeczy? – RPM1984

+0

Punktem mojej odpowiedzi jest to, że nie musisz robić tego, co myślisz, że musisz zrobić ... ciąg nie jest "magiczny". Cokolwiek jest zawarte w pakiecie, jeśli się zmieni, "magiczny ciąg" zostanie zaktualizowany na podstawie tych treści. –

+0

Dotyk to za mało, ponieważ faktycznie trzeba zmienić zawartość. Możesz użyć 'StreamWriter', aby zapisać zmienioną zawartość z db do fizycznych plików, w takim przypadku hash zajmie się sobą. –

3

Mam dla ciebie dobre wiadomości. Wiele osób prosiło o wsparcie wirtualnego dostawcy ścieżek dla scenariuszy podobnych do twoich, gdzie mają treść, która niekoniecznie pochodzi z dysku, więc obecnie planujemy wspierać VPP w następnej wersji.

Aby skorzystać z tej pomocy, będziesz musiał zaimplementować VPP dla dynamicznego js/css.

VPP ma również wbudowane mechanizmy zależności pamięci podręcznej, więc powinniśmy być w stanie użyć ich do automatycznego opróżnienia właściwego wpisu w pamięci podręcznej pakietu.