2013-02-07 7 views
5

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:

  1. Richiesta http://myserver/iismodulecachetest/foobar
  2. Direttamente modificare C: \ testvirtdir \ immagine.png (cambiare il suo colore in vernice e ri-salvare).
  3. 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:

  1. un riciclo del app-pool risolve il problema.
  2. In attesa di un momento risolve il problema.
  3. 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.
  4. La disabilitazione della cache in web.config non ha fatto alcuna differenza. <caching enabled="false" enableKernelCache="false" />
  5. 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.
  6. 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.
  7. 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:

  1. Disabilitare la cache e la cache del kernel a livello di server non fa differenza.
  2. L'aggiunta di un'estensione all'URL non fa alcuna differenza http://myserver/iismodulecachetest/foobar.png.
  3. 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:

Good Request

Ma una volta che si blocca, mostra più volte un colpo di cache:

Bad Request

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:

Good Request 2

E poi la successiva (difettoso) richiesta di cache-hit:

Bad Request 2

Si noti inoltre che il la directory è apparentemente monitorata, come da FileDirmoned="true".

+0

È possibile confermare che la data di modifica sul file cambia effettivamente? –

+0

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

+1

Aprirei un ticket di supporto con Microsoft. È chiaramente un bug, quindi dovrebbe essere libero al 100%. –

risposta

1

Puoi fare qualcosa di simile qui sotto.

void context_PostAuthenticateRequest(object sender, EventArgs e) 
{ 
    if (HttpContext.Current.Request.Path.ToLower().Contains("foobar")) 
    { 
     Random rnd = new Random(); 
     int randomNumber = rnd.Next(int.MinValue, int.MaxValue); 
     HttpContext.Current.RewritePath("virtdir/image.png?"+randomNumber); 
    } 
} 
+0

In linea di principio suppongo che ciò sovvertirebbe la cache e quindi aggirerebbe il problema, anche se in pratica l'istanza di 'Random' avrebbe bisogno di essere trattata come un singleton per evitare di ripetere valori. – Snixtor

+0

hai ragione, ho corretto quella parte. – Cagatay

0

Ho avuto lo stesso problema con il metodo per affrontare RewritePath risorse statiche in una directory virtuale. Non ho una soluzione per l'uso di questo metodo, ma alla fine ho optato per utilizzare il metodo Server.TransferRequest e questo non mostra problemi di memorizzazione nella cache.

HttpContext.Current.Server.TransferRequest(newUrl); 

Il trasferimento richiesta viene elaborata ancora una volta dal IHttpModule quindi è necessario stare attenti a non produrre loop.

Problemi correlati