asp.net http browser caching

Deshabilitar el almacenamiento en caché del navegador para todos los navegadores desde ASP.NET



http browser (6)

Consulte también ¿Cómo evitar que google chrome guarde en caché mis entradas, especialmente las ocultas cuando el usuario hace clic atrás? sin el cual Chrome podría recargar pero preservar el contenido anterior de <input> elementos <input> ; en otras palabras, use autocomplete="off" .

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.

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 Dos importantes diferencias entre Firefox e IE Caching describe algunas diferencias de comportamiento del protocolo HTTP.

El siguiente código de ejemplo ilustra el tipo de cosa que me interesa

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


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

Deja de almacenar en la memoria caché en Firefox e IE, pero no hemos probado otros navegadores. Los siguientes encabezados de respuesta se agregan mediante estas declaraciones:

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


Hay dos enfoques que conozco. 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 páginas que se "actualizan" (otra directiva de respuesta). La actualización parece menos probable que provenga del caché.

Espero que ayude.


Por lo que vale, solo tuve 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); }


Probé varias combinaciones y las fallé 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.


Voy a probar agregando la etiqueta sin 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 veré el siguiente de ETag si el no-store no es confiable:

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

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