2011-12-01 10 views
7

Historia del fondo:IE 8 y el almacenamiento en caché del lado del cliente

que tiene un portal web en .NET 3.5 en un servidor web IIS 6. Actualmente hay una página a la que se le asigna un valor y en función de ese valor busca un archivo PDF en un servicio web y muestra los resultados al usuario en otra pestaña de la página web. Esto se hace con el siguiente código.

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(); 

Esto funciona y funciona desde hace años. Sin embargo, recibimos un problema del cliente de que un cliente en particular tenía el PDF devuelto como el mismo PDF cada vez hasta que borraban la caché de Internet temporal.

Pensé, genial, es fácil. Simplemente agregaré los encabezados de caché a la respuesta para nunca almacenarla en caché. Por lo que añade lo siguiente:

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 

Después de una prueba rápida me dieron exactamente lo que estaba esperando en la cabecera de respuesta.

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

El problema:

Así que este se puso en marcha. Todo parecía genial el primer día. El día después, bam, todos comenzaron a recibir pantallas blancas y no se mostró ningún PDF. Después de una investigación más profunda, descubrí que solo era IE 6,7,8. Chrome está bien, Firefox está bien, safari bien, incluso IE 9 bien. Sin saber por qué sucedió esto, revertí mi cambio y lo implementé, y todo comenzó a funcionar nuevamente.

He buscado por todas partes intentando averiguar por qué mis encabezados de caché parecían confundir IE 6-8 en vano. ¿Alguien ha experimentado este tipo de problema con IE 6-8? ¿Hay algo que este olvidando? Gracias por cualquier idea.

Respuesta

6

Encontré la solución. Esto es lo que me avisó. Here is a link

Básicamente IE8 (y menor) tenía problemas con el encabezado Cache-Control si tenía no-cache o store-cache. Pude evitar el problema básicamente al permitir el almacenamiento en caché privado y establecer una edad máxima a muy corta, por lo que caduca casi de inmediato.

//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

Gracias por publicar esto. Perdí muchas horas y mucha frustración tratando de resolver esto. –

Cuestiones relacionadas