... oder wie ich gelernt habe, mich nicht mehr zu sorgen und einfach Code gegen vollständig undokumentierte APIs von Microsoft zu schreiben . Gibt es eine tatsächliche Dokumentation der offiziellen System.Web.Optimization
Veröffentlichung? Weil ich sicher keine finden kann, es keine XML-Dokumente gibt und alle Blog-Beiträge auf die RC-API verweisen, die sich wesentlich unterscheidet. Wie auch immer ..
Ich schreibe Code, um Javascript-Abhängigkeiten automatisch aufzulösen, und erstelle aus diesen Abhängigkeiten im laufenden Betrieb Bundles. Alles funktioniert hervorragend, außer wenn Sie Skripte bearbeiten oder auf andere Weise Änderungen vornehmen, die sich auf ein Bundle auswirken würden, ohne die Anwendung neu zu starten, werden die Änderungen nicht übernommen. Daher habe ich eine Option hinzugefügt, um das Caching der Abhängigkeiten für die Verwendung in der Entwicklung zu deaktivieren.
Anscheinend wird BundleTables
die URL jedoch auch dann zwischengespeichert , wenn sich die Bundle-Sammlung geändert hat . Wenn ich beispielsweise in meinem eigenen Code ein Bundle neu erstellen möchte, gehe ich folgendermaßen vor:
// 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"
Immer wenn ich ein Bundle mit demselben Alias entferne und neu erstelle , passiert absolut nichts: Die bundleUrl
Rückgabe von ResolveBundleUrl
ist dieselbe wie vor dem Entfernen und Neuerstellen des Bundles. Mit "dasselbe" meine ich, dass der Inhalts-Hash unverändert bleibt, um den neuen Inhalt des Bundles widerzuspiegeln.
bearbeiten ... eigentlich ist es viel schlimmer als das. Das Bundle selbst wird irgendwie außerhalb der Bundles
Sammlung zwischengespeichert. Wenn ich nur meinen eigenen zufälligen Hash generiere, um zu verhindern, dass der Browser das Skript zwischenspeichert, gibt ASP.NET das alte Skript zurück . Offensichtlich BundleTable.Bundles
bewirkt das Entfernen eines Bundles aus nichts.
Ich kann einfach den Alias ändern, um dieses Problem zu umgehen, und das ist für die Entwicklung in Ordnung, aber ich mag diese Idee nicht, da ich entweder nach jedem Laden der Seite Aliase verwerfen muss oder eine BundleCollection habe, deren Größe zunimmt jede Seite wird geladen. Wenn Sie dies in einer Produktionsumgebung aktiviert lassen, wäre dies eine Katastrophe.
Es scheint also, dass ein Skript, wenn es bereitgestellt wird, unabhängig vom tatsächlichen BundleTables.Bundles
Objekt zwischengespeichert wird. Wenn Sie also eine URL wiederverwenden, selbst wenn Sie das Bundle, auf das sie verwiesen hat, vor der Wiederverwendung entfernt haben, antwortet sie mit dem, was sich in ihrem Cache befindet, und das Ändern des Bundles
Objekts leert den Cache nicht - also nur neue Elemente (oder Vielmehr würden jemals neue Gegenstände mit einem anderen Namen verwendet.
Das Verhalten scheint seltsam ... Wenn Sie etwas aus der Sammlung entfernen, sollte es aus dem Cache entfernt werden. Aber das tut es nicht. Es muss eine Möglichkeit geben, diesen Cache zu leeren und den aktuellen Inhalt des Caches BundleCollection
anstelle dessen zu verwenden, was beim ersten Zugriff auf dieses Bundle zwischengespeichert wurde.
Irgendeine Idee, wie ich das machen würde?
Es gibt diese ResetAll
Methode, die einen unbekannten Zweck hat, aber trotzdem die Dinge kaputt macht, so dass es nicht so ist.