Possiedo un'implementazione IHttpModule di ASP.NET progettata per riscrivere i percorsi per la pubblicazione dei file. Il modulo gestisce un solo evento, PostAuthenticateRequest
, come segue:ASP.NET HttpModule La cache della directory virtuale RewritePath non si aggiorna
void context_PostAuthenticateRequest(object sender, EventArgs e)
{
if (HttpContext.Current.Request.Path.ToLower().Contains("foobar"))
{
HttpContext.Current.RewritePath("virtdir/image.png");
}
}
Il percorso "virtdir", è un bambino directory virtuale dell'applicazione. L'applicazione stessa viene eseguita in una posizione tipica: C: \ inetpub \ wwwroot \ IisModuleCacheTest \ La directory virtuale "virtdir" viene mappato a C: \ TestVirtDir \
Una richiesta di http://myserver/iismodulecachetest/foobar
sarà, come previsto, tornare image.png da la directory virtuale. Allo stesso modo, una richiesta a http://myserver/iismodulecachetest/virtdir/image.png
restituirà lo stesso file di immagine.
ho quindi eseguire il seguente:
- Richiesta
http://myserver/iismodulecachetest/foobar
- Direttamente modificare C: \ testvirtdir \ immagine.png (cambiare il suo colore in vernice e ri-salvare).
- Ripetere.
Dopo aver spostato tra 1 e 20 ripetizioni a distanza di alcuni secondi, l'immagine restituita sarà una copia non aggiornata.
Una volta sconvolto, il server restituirà la versione corrente solo dopo un intervallo di tempo sconosciuto (da 10 secondi a pochi minuti). Se sostituisco l'URL nel passaggio 1 con http://myserver/iismodulecachetest/virtdir/image.png
, il problema non sembra verificarsi. Ma stranamente, dopo che il problema è sorto usando l'URL "foobar", l'URL diretto inizia a restituire una copia non aggiornata dell'immagine.
Pertinente Dettagli:
- un riciclo del app-pool risolve il problema.
- In attesa di un momento risolve il problema.
- Ripetutamente il salvataggio del file non sembra avere un effetto. Mi chiedevo se un evento "file modificato" si stava perdendo, ma una volta bloccato posso salvare una mezza dozzina di modifiche e Iis stil non restituisce una nuova copia.
- La disabilitazione della cache in web.config non ha fatto alcuna differenza.
<caching enabled="false" enableKernelCache="false" />
- Il fatto che questa sia una directory virtuale sembra importare, non è stato possibile replicare il problema con image.png essendo parte del contenuto dell'applicazione stessa.
- Questo è non un client-cache, è sicuramente il server che restituisce una versione obsoleta. Ho verificato ciò esaminando le intestazioni delle richieste, Ctrl + F5 aggiornando, anche utilizzando browser separati.
- Ho replicato il problema su due macchine. Win7 Pro 6.1.7601 SP1 + IIS 7.5.7600.16385 e Server 2008 R2 6.1.7601 SP1 + IIS 7.5.7600.16385.
Modifica - Maggiori Dettagli:
- Disabilitare la cache e la cache del kernel a livello di server non fa differenza.
- L'aggiunta di un'estensione all'URL non fa alcuna differenza
http://myserver/iismodulecachetest/foobar.png
. - L'associazione di un debugger a IIS mostra che il gestore di eventi
context_PostAuthenticateRequest
viene attivato ogni volta e si comporta allo stesso modo indipendentemente dal fatto che la cache sia bloccata o meno. .
Edit2 - IIS registra:
ho permesso "traccia richieste non riuscite" in IIS (interessante come questo funziona per non richieste -failed anche se configurato in modo appropriato Il gasdotto è identica fino al passo . 17 in cui la richiesta di restituzione del fuori versione aggiornata mostra chiaramente una cache hit
la prima richiesta sembra proprio bene, con una cache miss:
Ma una volta che si blocca, mostra più volte un colpo di cache:
Gli eventi dopo il colpo di cache sono, comprensibilmente, molto diverso rispetto allo scenario di cache perdere. Sembra proprio che IIS sia perfettamente contento di pensare che la sua cache di file sia aggiornata, quando non lo è assolutamente! :(
Un po 'più in basso nello stack vediamo prima richiesta:
E poi la successiva (difettoso) richiesta di cache-hit:
Si noti inoltre che il la directory è apparentemente monitorata, come da FileDirmoned="true"
.
È possibile confermare che la data di modifica sul file cambia effettivamente? –
Sì, appena testato ora. Esplora risorse mostra chiaramente una nuova data di modifica per il file, ma IIS sta ancora restituendo la versione precedente. L'intestazione Http "Last-Modified" restituisce anche la * vecchia * data di modifica. – Snixtor
Aprirei un ticket di supporto con Microsoft. È chiaramente un bug, quindi dovrebbe essere libero al 100%. –