2011-12-01 13 views
7

storia di fondo:IE 8 e client-side caching

Ho un portale web in .NET 3.5 su un server Web IIS 6. Attualmente esiste una pagina a cui viene assegnato un valore e in base a tale valore cerca un file PDF su un servizio Web e visualizza i risultati all'utente in un'altra scheda nella pagina Web. Questo è fatto con il seguente codice.

context.Response.ClearContent(); 
context.Response.ClearHeaders(); 
context.Response.Clear(); 
context.Response.AddHeader("Accept-Header", pdfStream.Length.ToString());            
context.Response.ContentType = "application/pdf"; 
context.Response.BinaryWrite(pdfStream.ToArray()); 
context.Response.Flush(); 

Questo funziona e ha funzionato per anni. Tuttavia, abbiamo ricevuto un problema dal client che un particolare client stava avendo il PDF restituito come lo stesso PDF ogni volta fino a quando non hanno cancellato la cache di Internet temporanea.

Ho pensato che fosse bello, questo è facile. Aggiungerò semplicemente le intestazioni della cache alla risposta per non memorizzarla mai. Così ho aggiunto il seguente:

context.Response.Cache.SetCacheability(HttpCacheability.NoCache);//IE set to not cache 
context.Response.Cache.SetNoStore();//Firefox/Chrome not to cache 
context.Response.Cache.SetExpires(DateTime.UtcNow); //for safe measure expire it immediately 

Dopo un test rapido ho ottenuto esattamente quello che mi aspettavo nell'intestazione della risposta.

Cache-Control no-cache, no-store 
Pragma no-cache 
Expires -1 

Il problema:

Quindi questo è andato in diretta. Tutto sembrava bello al primo giorno. Il giorno dopo, bam, tutti hanno iniziato a ricevere schermi bianchi e nessun PDF visualizzato. Dopo ulteriori indagini, ho scoperto che era solo IE 6,7,8. Chrome va bene, Firefox va bene, safari bene, anche IE 9 bene. Senza sapere perché è successo, ho ripristinato il mio cambiamento e l'ho distribuito, e tutto ha funzionato di nuovo.

Ho cercato dappertutto cercando di scoprire perché le mie intestazioni di cache sembravano confondere IE 6-8 senza successo. Qualcuno ha avuto questo tipo di problema con IE 6-8? C'è qualcosa che mi manca? Grazie per qualsiasi intuizione.

risposta

6

Ho trovato la soluzione. Ecco cosa mi ha dato la mancia. Here is a link

In pratica IE8 (e inferiore) aveva problemi con l'intestazione Cache-Control se aveva no-cache o store-cache. Sono stato in grado di aggirare il problema, fondamentalmente consentendo solo il caching privato e impostare un limite massimo di età molto breve, quindi scade quasi immediatamente.

//Ie 8 and lower have an issue with the "Cache-Control no-cache" and "Cache-Control store-cache" headers. 
//The work around is allowing private caching only but immediately expire it. 
if ((Request.Browser.Browser.ToLower() == "ie") && (Request.Browser.MajorVersion < 9)) 
{ 
    context.Response.Cache.SetCacheability(HttpCacheability.Private); 
    context.Response.Cache.SetMaxAge(TimeSpan.FromMilliseconds(1)); 
} 
else 
{ 
    context.Response.Cache.SetCacheability(HttpCacheability.NoCache);//IE set to not cache 
    context.Response.Cache.SetNoStore();//Firefox/Chrome not to cache 
    context.Response.Cache.SetExpires(DateTime.UtcNow); //for safe measure expire it immediately 
} 
+0

Grazie per aver postato questo. Ho sprecato così tante ore e tanta frustrazione cercando di capirlo. –

Problemi correlati