2009-05-27 49 views
78

Estoy buscando una referencia definitiva de qué código ASP.NET se requiere para que los navegadores deshabilitados guarden en caché la página. Hay muchas maneras de afectar los encabezados HTTP y metaetiquetas y me da la impresión de que se requieren diferentes configuraciones para que los diferentes navegadores se comporten correctamente. Sería realmente genial obtener un código de referencia de comentario para indicar qué funciona para todos los navegadores y qué se requiere para un navegador en particular, incluidas las versiones.Deshabilitar el almacenamiento en caché del navegador para todos los navegadores desde ASP.NET

Existe una gran cantidad de información sobre este tema, pero aún no he encontrado una buena referencia que describa los beneficios de cada método y si una técnica particular ha sido reemplazada por una API de nivel superior.

Estoy particularmente interesado en ASP.NET 3.5 SP1, pero también sería bueno obtener respuestas para versiones anteriores.

Esta entrada de blog Two Important Differences between Firefox and IE Caching describe algunas diferencias de comportamiento del protocolo HTTP.

El siguiente código de ejemplo ilustra el tipo de cosas que estoy interesado en

public abstract class NoCacheBasePage : System.Web.UI.Page 
{ 
    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 

     DisableClientCaching(); 
    } 

    private void DisableClientCaching() 
    { 
     // Do any of these result in META tags e.g. <META HTTP-EQUIV="Expire" CONTENT="-1"> 
     // HTTP Headers or both? 

     // Does this only work for IE? 
     Response.Cache.SetCacheability(HttpCacheability.NoCache); 

     // Is this required for FireFox? Would be good to do this without magic strings. 
     // Won't it overwrite the previous setting 
     Response.Headers.Add("Cache-Control", "no-cache, no-store"); 

     // Why is it necessary to explicitly call SetExpires. Presume it is still better than calling 
     // Response.Headers.Add(directly 
     Response.Cache.SetExpires(DateTime.UtcNow.AddYears(-1)); 
    } 
} 
+5

Intentaría responder si no supiera cuán terriblemente imposible es tu tarea. Controlar la memoria caché del cliente es como tratar de usar palillos de 10 pies de largo para reorganizar los muebles. –

+0

Un montón de respuestas que cubren solo una parte del problema aún serían muy valiosas. Por favor arroje su valor de 2 centavos. –

Respuesta

91

Esto es lo que usamos en ASP.NET:

// Stop Caching in IE 
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache); 

// Stop Caching in Firefox 
Response.Cache.SetNoStore(); 

que se detenga el almacenamiento en caché en Firefox e IE, pero no lo hemos probado otros navegadores. Los siguientes cabeceras de respuesta se añadió en estas declaraciones:

Cache-Control: no-cache, no-store 
Pragma: no-cache 
+0

+1 .. Gracias por su sugerencia –

+5

+1 Esto está trabajando para mí en Chrome, muchas gracias. También uso Response.Cache.SetAllowResponseInBrowserHistory (true); para evitar el historial para almacenar una entrada para cada solicitud de la misma página. – daniloquio

+12

Al parecer, alguien ha descubierto que el uso de SetCacheability con NoCache también desactiva la memoria caché de salida de ASP.NET (caché del lado del servidor). Sugieren usar la opción ServerAndNoCache en su lugar. http://codeclimber.net.nz/archive/2007/04/01/Beware-the-ASP.NET-SetCacheability-method.aspx – md1337

1

Hay dos enfoques, que yo sepa. El primero es decirle al navegador que no almacene en caché la página. Establecer la respuesta a no caché se ocupa de eso, sin embargo, como sospecha, el navegador a menudo ignorará esta directiva. El otro enfoque es establecer la fecha y hora de su respuesta a un punto en el futuro. Creo que todos los navegadores corregirán esto a la hora actual cuando agreguen la página al caché, pero mostrará la página como más nueva cuando se realice la comparación. Creo que puede haber algunos casos donde no se haga una comparación. No estoy seguro de los detalles y cambian con cada nueva versión del navegador. Nota final He tenido mejor suerte con las páginas que se "actualizan" (otra directiva de respuesta). La actualización parece menos probable que provenga del caché.

Espero que ayude.

37

Por si sirve de algo, yo sólo tenía que manejar esto en mi aplicación ASP.NET MVC 3. Aquí está el bloque de código que utilicé en el archivo Global.asax para manejar esto para todas las solicitudes.

protected void Application_BeginRequest() 
    { 
     //NOTE: Stopping IE from being a caching whore 
     HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false); 
     HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     HttpContext.Current.Response.Cache.SetNoStore(); 
     Response.Cache.SetExpires(DateTime.Now); 
     Response.Cache.SetValidUntilExpires(true); 
    } 
+0

El 'HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory (false)' marcó la diferencia para evitar el almacenamiento en caché con IE y FireFox –

+0

esta respuesta no funcionó para mí –

+2

-1, la configuración en estas Application_BeginRequest() hace que los encabezados sin caché se envíen para los elementos que probablemente desee guardar en la memoria caché (archivos JavaScript, imágenes, etc.). Todavía no lo he probado, pero la ubicación del OP (establecer los encabezados en la página ASP) probablemente sea mejor. –

2

He intentado varias combinaciones y he fallado en FireFox. Ha pasado un tiempo, por lo que la respuesta anterior puede funcionar bien o puede haber perdido algo.

Lo que siempre me ha funcionado es agregar lo siguiente al encabezado de cada página, o la plantilla (página maestra en .net).

<script language="javascript" type="text/javascript"> 
    window.onbeforeunload = function() { 
     // This function does nothing. It won't spawn a confirmation dialog 
     // But it will ensure that the page is not cached by the browser. 
    } 
</script> 

Esto ha desactivado todo el almacenamiento en caché en todos los navegadores para mí sin falta.

+7

No estoy seguro lo que se supone que debe hacer, pero parece un gran truco gordo que seguramente fallará en la próxima actualización de cualquiera de estos navegadores. – md1337

+0

Se explica en, por ejemplo, https://web.archive.org/web/20160112095216/http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript - en resumen, se implementó el evento onbeforeunload para ser utilizado por los bancos y evita que la página se guarde en caché. – ChrisW

0

Voy a probar agregando la etiqueta de no-tienda a nuestro sitio para ver si esto hace una diferencia en el almacenamiento en caché del navegador (Chrome a veces ha estado almacenando en caché las páginas).También encontré este artículo muy útil en la documentación sobre cómo y por qué funciona el almacenamiento en caché y se verá en ETag del próximo si el no-store no es confiable:

http://www.mnot.net/cache_docs/

http://en.wikipedia.org/wiki/HTTP_ETag

Cuestiones relacionadas