Estoy buscando una referencia definitiva a qué código ASP.NET se requiere para que los navegadores deshabiliten el almacenamiento en caché de la página. Hay muchas formas de afectar los encabezados HTTP y las metaetiquetas y tengo la impresión de que se requieren diferentes configuraciones para que los diferentes navegadores se comporten correctamente. Sería realmente bueno que se comentara un fragmento de código de referencia para indicar cuál funciona para todos los navegadores y cuál es necesario para un navegador en particular, incluidas las versiones.
Hay una gran cantidad de información sobre este tema, pero todavía tengo que encontrar una buena referencia que describa los beneficios de cada método y si una técnica en 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 la versión anterior.
Esta entrada de blog Dos diferencias importantes entre el almacenamiento en caché de Firefox e IE describe algunas diferencias de comportamiento del protocolo HTTP.
El siguiente código de muestra ilustra el tipo de cosas que me interesan
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));
}
}
Respuestas:
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 caché en Firefox e IE, pero no hemos probado otros navegadores. Estas declaraciones agregan los siguientes encabezados de respuesta:
Cache-Control: no-cache, no-store Pragma: no-cache
fuente
SetCacheability
.SetNoStore
es una solución temporal de IE6. Consulte ¿Por qué se deben usar tanto sin caché como sin almacenamiento en la respuesta HTTP? .Por lo que vale, tuve que manejar esto en mi aplicación ASP.NET MVC 3. Aquí está el bloque de código que usé 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); }
fuente
HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false)
hizo la diferencia para evitar el almacenamiento en caché en bith IE y FirefoxProbé varias combinaciones y fallaron en FireFox. Ha pasado un tiempo, por lo que la respuesta anterior puede funcionar bien o puede que me haya 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 sin falta.
fuente
Hay dos enfoques que conozco. La primera es decirle al navegador que no almacene la página en caché. Establecer la Respuesta en sin caché se encarga 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 en 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 haga la comparación. Creo que puede haber algunos casos en los que 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 más suerte con las páginas que se "actualizan" por sí mismas (otra directiva de respuesta). Parece menos probable que la actualización provenga del caché.
Espero que ayude.
fuente
Voy a probar la adición de la etiqueta no-store 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 sobre documentación sobre cómo y por qué funciona el almacenamiento en caché y veré ETag a continuación si el no-store no es confiable:
http://www.mnot.net/cache_docs/
http://en.wikipedia.org/wiki/HTTP_ETag
fuente
Consulte también ¿Cómo evitar que Google Chrome almacene en caché mis entradas, especialmente las ocultas cuando el usuario hace clic en Atrás? sin el cual Chrome podría recargar pero conservar el contenido anterior de los
<input>
elementos, en otras palabras, usarautocomplete="off"
.fuente