... lub jak nauczyłem się przestać się martwić i po prostu pisać kod w całkowicie nieudokumentowanych interfejsach API firmy Microsoft . Czy istnieje rzeczywista dokumentacja oficjalnego System.Web.Optimization
wydania? Ponieważ na pewno nie mogę znaleźć żadnego, nie ma dokumentów XML, a wszystkie posty na blogu odnoszą się do RC API, które jest zasadniczo inne. Anyhoo ..
Piszę kod, aby automatycznie rozwiązywać zależności javascript i tworzę pakiety w locie z tych zależności. Wszystko działa świetnie, z wyjątkiem sytuacji, gdy edytujesz skrypty lub w inny sposób wprowadzasz zmiany, które wpłynęłyby na pakiet bez ponownego uruchamiania aplikacji, zmiany nie zostaną odzwierciedlone. Dodałem więc opcję wyłączenia buforowania zależności do wykorzystania w rozwoju.
Jednak najwyraźniej BundleTables
buforuje adres URL, nawet jeśli kolekcja paczek uległa zmianie . Na przykład w moim własnym kodzie, gdy chcę ponownie utworzyć pakiet, robię coś takiego:
// remove an existing bundle
BundleTable.Bundles.Remove(BundleTable.Bundles.GetBundleFor(bundleAlias));
// recreate it.
var bundle = new ScriptBundle(bundleAlias);
// dependencies is a collection of objects representing scripts,
// this creates a new bundle from that list.
foreach (var item in dependencies)
{
bundle.Include(item.Path);
}
// add the new bundle to the collection
BundleTable.Bundles.Add(bundle);
// bundleAlias is the same alias used previously to create the bundle,
// like "~/mybundle1"
var bundleUrl = BundleTable.Bundles.ResolveBundleUrl(bundleAlias);
// returns something like "/mybundle1?v=hzBkDmqVAC8R_Nme4OYZ5qoq5fLBIhAGguKa28lYLfQ1"
Za każdym razem, gdy usuwam i ponownie tworzę pakiet z tym samym aliasem , absolutnie nic się nie dzieje: bundleUrl
zwracany plik ResolveBundleUrl
jest taki sam, jak przed usunięciem i odtworzeniem pakietu. Przez „ten sam” rozumiem, że skrót zawartości pozostaje niezmieniony, aby odzwierciedlić nową zawartość pakietu.
edytuj ... właściwie, jest znacznie gorzej. Sam pakiet jest w jakiś sposób buforowany poza Bundles
kolekcją. Jeśli po prostu wygeneruję własny losowy skrót, aby zapobiec buforowaniu skryptu przez przeglądarkę, ASP.NET zwraca stary skrypt . Najwyraźniej usunięcie pakietu z BundleTable.Bundles
faktycznie nic nie robi.
Mogę po prostu zmienić alias, aby obejść ten problem, i jest to w porządku w przypadku programowania, ale nie podoba mi się ten pomysł, ponieważ oznacza to, że muszę wycofywać aliasy po każdym załadowaniu strony lub mieć kolekcję BundleCollection, która rośnie w każde ładowanie strony. Jeśli zostawisz to włączone w środowisku produkcyjnym, byłaby to katastrofa.
Wygląda więc na to, że kiedy skrypt jest obsługiwany, jest buforowany niezależnie od rzeczywistego BundleTables.Bundles
obiektu. Więc jeśli ponownie użyjesz adresu URL, nawet jeśli usunąłeś pakiet, do którego się odnosił przed ponownym użyciem, odpowiada on tym, co jest w jego pamięci podręcznej, a zmiana Bundles
obiektu nie powoduje opróżnienia pamięci podręcznej - więc tylko nowe elementy (lub raczej nowe przedmioty o innej nazwie) byłyby kiedykolwiek używane.
Zachowanie wydaje się dziwne ... usunięcie czegoś z kolekcji powinno usunąć to z pamięci podręcznej. Ale tak nie jest. Musi istnieć sposób, aby opróżnić tę pamięć podręczną i użyć bieżącej zawartości plikuBundleCollection
zamiast tego, co buforowała, gdy po raz pierwszy uzyskano dostęp do tego pakietu.
Masz jakiś pomysł, jak bym to zrobił?
Jest taka ResetAll
metoda, która ma nieznane przeznaczenie, ale i tak wszystko psuje, więc nie o to chodzi.