UPDATE: La versione precedente non ha funzionato su Azure, ho semplificato e corretto sotto. (Si noti, per questo di lavorare in modalità di sviluppo con IIS Express, è necessario installare URL Rewrite 2.0 da Microsoft http://www.iis.net/downloads/microsoft/url-rewrite - utilizza il programma di installazione WebPi, assicurarsi di chiudere Visual Studio prima)
UPDATE: regola fissa per file .min
Recentemente ho passato una giornata completamente infruttuosa cercando di ottenere il bundling automatico (per supportare la versione automatica) in C#/Net 4.6/MVC 5/Razor per funzionare. Ho letto molti articoli sia su StackOverflow che altrove, ma non sono riuscito a trovare una spiegazione end-to-end su come configurarla. Inoltre non mi interessa il modo in cui i file sono version-ed (aggiungendo una stringa di query con la versione alla richiesta di file statici - ad esempio somefile.js? V = 1234) perché alcuni mi hanno detto che alcuni server proxy ignorano la query stringhe quando si memorizzano nella cache le risorse statiche.
Quindi, dopo un breve viaggio nella tana del coniglio, ho eseguito il rollback della mia versione per l'auto-versioning e ho incluso istruzioni complete su come farlo funzionare di seguito.
completa discussione @: Simplified Auto-Versioning of Javascript/CSS in ASP.NET MVC 5 to stop caching issues (works in Azure and Locally) With or Without URL Rewrite
IL PROBLEMA: Hai in generale 2 tipi di file JavaScript/CSS in un progetto.
1) 3 librerie di parti (come jquery o baffi) che cambiano molto raramente (e quando lo fanno, la versione sul file generalmente cambia) - queste possono essere raggruppate/minificate su una base "necessaria" usando WebGrease o JSCompress.com (includere solo il file in bundle/versione in _Layout.cshtml)
2) file css/js specifici della pagina che devono essere aggiornati ogni volta che viene spinto un nuovo build. (Senza avere la cache burbero chiara utente o fare rinfresca multipli)
mia soluzione: incremento automatico della versione di assembly ogni volta che il progetto è costruito, e l'uso che il numero di file statico instradato sulle risorse specifiche ti piacerebbe rimanere aggiornato. (quindi qualcosa.js è incluso come qualcosa.v1234.js con 1234 che cambia automaticamente ogni volta che il progetto viene creato) - Ho anche aggiunto alcune funzionalità aggiuntive per garantire che i file .min.js vengano utilizzati in produzione e che vengano utilizzati i file regular.js durante il debug (sto usando WebGrease per automatizzare il processo di minimizzazione) Una cosa bella di questa soluzione è che funziona in modalità locale/dev e anche in produzione.
Come fare: incremento automatico della versione di assembly ogni volta che il progetto è costruito, e l'uso che il numero di file statico instradato sulle risorse specifiche che si desidera mantenere aggiornato. (quindi qualcosa.js è incluso come qualcosa.v1234.js con 1234 che cambia automaticamente ogni volta che il progetto viene creato) - Ho anche aggiunto alcune funzionalità aggiuntive per garantire che i file .min.js vengano utilizzati in produzione e che vengano utilizzati i file regular.js durante il debug (sto usando WebGrease per automatizzare il processo di minimizzazione) Una cosa bella di questa soluzione è che funziona in modalità locale/dev e anche in produzione. (Sto usando Visual Studio 2015/Net 4.6, ma credo che questo sarà il lavoro nelle versioni precedenti, nonché
Fase 1:. attivare Auto-incremento sul gruppo quando costruito Nel AssemblyInfo.File cs (che si trova nella sezione "proprietà" del progetto modificare le seguenti righe:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
a
[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyFileVersion("1.0.0.0")]
Fase 2: Impostare URL Rewrite in web.config per i file con incorporato lumache di versione (vedi punto 3)
nel web.config (quello principale per il progetto) aggiungere le regole follwing nel system.webServer.
<rewrite>
<rules>
<rule name="static-autoversion">
<match url="^(.*)([.]v[0-9]+)([.](js|css))$" />
<action type="Rewrite" url="{R:1}{R:3}" />
</rule>
<rule name="static-autoversion-min">
<match url="^(.*)([.]v[0-9]+)([.]min[.](js|css))$" />
<action type="Rewrite" url="{R:1}{R:3}" />
</rule>
</rules>
</rewrite>
Passaggio 3: Imposta le variabili dell'applicazione per leggere la versione corrente dell'assieme e creare slug di versione nei file js e css.
a Global.asax.cs (che si trova nella directory principale del progetto) aggiungere il seguente codice di protezione Application_Start void() (dopo le righe Registra)
// setup application variables to write versions in razor (including .min extension when not debugging)
string addMin = ".min";
if (System.Diagnostics.Debugger.IsAttached) { addMin = ""; } // don't use minified files when executing locally
Application["JSVer"] = "v" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString().Replace('.','0') + addMin + ".js";
Application["CSSVer"] = "v" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString().Replace('.', '0') + addMin + ".css";
Fase 4: Modifica link src in Razor viste utilizzando le variabili dell'applicazione che abbiamo allestito in Global.asax.cs
@HttpContext.Current.Application["CSSVer"]
@HttpContext.Current.Application["JSVer"]
per esempio, nel mio _Layout.cshtml, nella mia sezione testa, ho il seguente blocco di codice per i fogli di stile:
<!-- Load all stylesheets -->
<link rel='stylesheet' href='https://fontastic.s3.amazonaws.com/8NNKTYdfdJLQS3D4kHqhLT/icons.css' />
<link rel='stylesheet' href='/Content/css/[email protected]["CSSVer"]' />
<link rel='stylesheet' media='(min-width: 700px)' href='/Content/css/[email protected]["CSSVer"]' />
<link rel='stylesheet' media='(min-width: 700px)' href='/Content/css/[email protected]["CSSVer"]' />
@RenderSection("PageCSS", required: false)
un paio di cose da notare: 1) non v'è alcuna estensione sul file. 2) non esiste neanche .min. Entrambi sono gestiti dal codice Global.asax.cs
Allo stesso modo, (anche in _Layout.cs) nel mio javascript sezione: Ho il seguente codice:
<script src="~/Scripts/all3bnd100.min.js" type="text/javascript"></script>
<script src="~/Scripts/[email protected]["JSVer"]" type="text/javascript"></script>
@RenderSection("scripts", required: false)
Il primo file è un pacchetto di tutte le mie librerie di terze parti che ho creato manualmente con WebGrease. Se aggiungo o modifico uno qualsiasi dei file nel pacchetto (che è raro), rinominare manualmente il file in all3bnd101.min.js, all3bnd102.min.js, ecc ... Questo file non corrisponde al gestore di riscrittura, quindi rimarrà memorizzato nella cache sul browser del client fino a quando non si riordina/modifica manualmente il nome.
Il secondo file è ui.js (che verrà scritto come ui.v12345123.js o ui.v12345123.min.js a seconda se si sta eseguendo in modalità di debug o meno) Questo verrà gestito/riscritto. (È possibile impostare un punto di interruzione in Application_OnBeginRequest di Global.asax.cs per guardare il lavoro)
discussione completa su questo a: Simplified Auto-Versioning of Javascript/CSS in ASP.NET MVC 5 to stop caching issues (works in Azure and Locally) With or Without URL Rewrite(Compreso un modo per farlo senza URL Rewrite)
hey clonked - Grazie mille per il codice, tuttavia il problema con l'utilizzo del numero di versione è dettagliato nell'articolo collegato sopra. Impedirà la memorizzazione nella cache, poiché le richieste con i parametri GET potrebbero non essere memorizzate nella cache (secondo le specifiche HTTP) e IE è noto per aver ignorato il numero di versione - ecco perché volevo un modo per includere il numero di versione all'interno dell'URL/file.123. css - ala URL Riscrivi – Tom
Le mie scuse, non ho letto il contenuto del tuo link. Sono contento anche se ho partecipato, perché ho imparato che i miei metodi non erano corretti! Vedrò se riesco a rivedere la mia soluzione e condividerla. –
Ho aggiornato il codice che ho postato per utilizzare la funzionalità di riscrittura degli URL di IIS 7. –