... o come ho imparato a smettere di preoccuparmi e scrivere codice contro API Microsoft completamente non documentate . Esiste una documentazione effettiva del System.Web.Optimization
rilascio ufficiale ? Perché di sicuro non riesco a trovarne nessuno, non ci sono documenti XML e tutti i post del blog si riferiscono all'API RC che è sostanzialmente diversa. Anyhoo ..
Sto scrivendo del codice per risolvere automaticamente le dipendenze javascript e sto creando bundle al volo da quelle dipendenze. Tutto funziona alla grande, tranne se modifichi gli script o apporti in altro modo modifiche che potrebbero influire su un pacchetto senza riavviare l'applicazione, le modifiche non verranno riflesse. Quindi ho aggiunto un'opzione per disabilitare la memorizzazione nella cache delle dipendenze da utilizzare nello sviluppo.
Tuttavia, apparentemente BundleTables
memorizza nella cache l'URL anche se la raccolta del bundle è cambiata . Ad esempio, nel mio codice quando voglio ricreare un bundle faccio qualcosa del genere:
// 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"
Ogni volta che rimuovo e ricrei un bundle con lo stesso alias , non accade assolutamente nulla: il bundleUrl
ritorno da ResolveBundleUrl
è lo stesso di prima che avessi rimosso e ricreato il bundle. Con "lo stesso" intendo che l'hash del contenuto è invariato per riflettere i nuovi contenuti del bundle.
modifica ... in realtà, è molto peggio di così. Il bundle stesso viene memorizzato nella cache in qualche modo al di fuori della Bundles
raccolta. Se generi semplicemente il mio hash casuale per impedire al browser di memorizzare nella cache lo script, ASP.NET restituisce il vecchio script . Quindi, apparentemente, la rimozione di un bundle da in BundleTable.Bundles
realtà non fa nulla.
Posso semplicemente cambiare l'alias per aggirare questo problema, e questo va bene per lo sviluppo, ma non mi piace l'idea poiché significa che devo deprecare gli alias dopo ogni caricamento della pagina o avere un BundleCollection che cresce di dimensioni su ogni caricamento della pagina. Se lo lasciassi attivo in un ambiente di produzione, sarebbe un disastro.
Quindi sembra che quando uno script viene servito, viene memorizzato nella cache indipendentemente BundleTables.Bundles
dall'oggetto reale . Quindi, se riutilizzi un URL, anche se hai rimosso il pacchetto a cui si riferiva prima di riutilizzarlo, risponde con tutto ciò che è nella sua cache e la modifica Bundles
dell'oggetto non svuota la cache, quindi solo i nuovi elementi (o piuttosto, nuovi elementi con un nome diverso) sarebbero mai stati utilizzati.
Il comportamento sembra strano ... rimuovere qualcosa dalla raccolta dovrebbe rimuoverlo dalla cache. Ma non è così. Deve esserci un modo per svuotare questa cache e fare in modo che utilizzi il contenuto corrente di BundleCollection
invece di quello che ha memorizzato nella cache al primo accesso a quel bundle.
Qualche idea su come lo farei?
C'è questo ResetAll
metodo che ha uno scopo sconosciuto ma rompe comunque le cose, quindi non è così.