¿Cuál es la mejor manera de lidiar con el caché y el botón Atrás del navegador?

StackOverflow https://stackoverflow.com/questions/23094

  •  09-06-2019
  •  | 
  •  

Pregunta

¿Cuál es la mejor manera de manejar que un usuario regrese a una página que tenía elementos almacenados en caché en una aplicación asp.net?¿Existe una buena manera de capturar el botón Atrás (evento?) y manejar el caché de esa manera?

¿Fue útil?

Solución

Puedes intentar usar el Propiedad HttpResponse.Cache si eso ayudara:

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(false);
Response.Cache.VaryByParams["Category"] = true;

if (Response.Cache.VaryByParams["Category"])
{
   //...
}

O podría bloquear el almacenamiento en caché de la página por completo con HttpResponse.CacheControl, pero ha quedado obsoleto a favor de la propiedad Cache anterior:

Response.CacheControl = "No-Cache";

Editar:O realmente podrías volverse loco y hazlo todo a mano:

Response.ClearHeaders();
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1 
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.1 
Response.AppendHeader("Keep-Alive", "timeout=3, max=993"); // HTTP 1.1 
Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.1 

Otros consejos

Hasta donde yo sé (o al menos he leído), lo mejor es intentar no trabajar en respuesta a los eventos del usuario, sino pensar "en la página".

Diseñe su aplicación para que no le importe si se presiona el botón Atrás.Simplemente se ocupará de ello...Esto puede significar un poco de trabajo extra desde el punto de vista del desarrollo, pero en general hará que la aplicación sea mucho más sólida.

Es decir, si el paso 3 realiza algunos cambios de datos, entonces el usuario hace clic hacia atrás (al paso 2) y hace clic en Siguiente nuevamente, luego la aplicación verifica si se han realizado los cambios.O, idealmente, no genera ninguna duro cambia hasta que el usuario hace clic en "Aceptar" al final.De esta manera, todos los cambios se almacenan y puede volver a completar el formulario en función de los valores ingresados ​​​​previamente al cargar, todas y cada una de las veces.

Espero que tenga sentido :)

RFC 2616 §13.13 dice que Historia y caché son cosas diferentes.No debería haber ninguna forma de que el caché afecte al botón Atrás.

Si cualquier combinación de encabezados HTTP afecta el botón Atrás, es un error en el navegador... con una excepción.

En HTTPS los navegadores interpretan Cache-control: must-revalidate como solicitud para actualizar páginas cuando se usa el botón Atrás (Mozilla lo llama "modo de banco tonto").Esto no es compatible con HTTP simple.

La mejor manera de solucionarlo es probablemente poner una directiva sin caché en sus páginas ASP.NET (o en una página maestra si está usando una).No creo que haya una manera de lidiar con esto directamente en su código ASP.NET (ya que la decisión de caché ocurre en el cliente).

En cuanto a MVC, no sé cómo lo lograría (suponiendo que sea diferente de ASP.NET basado en Web Forms);No lo he usado.

El siguiente código funcionó para mí en IE9+, FF21 y Latest Chrome:

Response.Cache.SetCacheability(HttpCacheability.NoCache | HttpCacheability.Private);
Response.Cache.AppendCacheExtension("must-revalidate");
Response.Cache.AppendCacheExtension("max-age=0");
Response.Cache.SetNoStore();

Puedes colocar esto en Page_Load() controlador de eventos en MasterPage para que cada página de su aplicación requiera un viaje de ida y vuelta al servidor al presionar el botón Atrás.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top