2010-01-18 25 views
5

Me he dado cuenta de que cuando Response.Redirect a una página .aspx, a veces muestra una página en caché en lugar de ejecutar la página y extraer datos recientes de la base de datos.¿Por qué Response.Redirect a veces extrae de la memoria caché?

No estoy utilizando el caché de resultados ni nada especial en .Net aquí: este es un CRM, y el almacenamiento en caché se está realizando en el cliente o, quizás más probablemente, automáticamente en IIS.

Nunca hay una cadena de consulta involucrada, por cierto. Estoy pasando una llave a través de la sesión. Sé que si utilizara la cadena de consulta probablemente desviaría parcialmente el problema de la memoria caché, pero no es una opción en este caso, y de todos modos lo que realmente quiero es una comprensión más profunda de lo que está sucediendo.

Hice un poco de investigación, y algunas personas solucionan esto utilizando Server.Transfer (que en realidad se comporta de manera diferente a Response.Redirect y algunos de los detalles no siempre son deseables), y algunas otras personas dicen que configure Response. Cache.SetCacheability (HttpCacheability.NoCache) en la página donde quiero evitar el almacenamiento en caché.

Me gustaría obtener una mejor comprensión de lo que está sucediendo aquí, y posiblemente una mejor práctica, por un lado, pensé que las páginas .aspx siempre estaban marcadas para evitar el almacenamiento en caché. ¿Derecha?

¿Alguna idea?

Respuesta

6

De manera predeterminada, no se envían encabezados diseñados para controlar el almacenamiento en caché. Esto deja al cliente para crear sus propias reglas sobre cómo almacenar en caché el contenido enviado.

Así que sí que necesitaría algo así como: -

Response.Cache.SetCacheability(HttpCacheability.NoCache) 

para asegurarse de que una solicitud (redirigir o de otra manera) no se limita a utilizar una versión en caché.

+0

@Brian: Lo haría si estuviera manejando botones, haga clic en el lado del servidor. – AnthonyWJones

+0

+1: nota rápida: agregué esto antes de response.redirect y no hice ninguna mierda, tuve que agregar esto a la página_carga de la página, no quiero que se guarde en la memoria caché, lo cual tiene sentido ¿no? – lurscher

5

Response.Redirect envía una respuesta al navegador que indica que el objeto solicitado se ha movido y le proporciona la nueva ubicación. En este caso, si redirige a "redirect.aspx", si el navegador tiene ese elemento en la caché, lo mostrará desde allí siempre que se cumplan los criterios de caché.

Menciona Response.Transfer, pero se refiere a Server.Transfer. Ese es un mecanismo del lado del servidor para transferir el contexto de ejecución a una nueva página. Entonces, el usuario solicita "main.aspx" en su aplicación. En esa página, usted Server.Transfer a "transfer.aspx". En el lado del servidor, es la misma solicitud, de modo que cuando se muestre el resultado, el navegador del cliente mostrará una URL de "main.aspx", no de "transfer.aspx".

Resumir - Redirigir = 2 solicitudes, Transferir = 1 solicitud. Espero que ayude.

Y sí, debe establecer la capacidad de caché si desea que las páginas siempre realicen una llamada al servidor. Por defecto, aspx no tiene un comportamiento especial del navegador, ya que solo envía html. Puede establecer:

Response.Expires = -1 por ejemplo.

Cuestiones relacionadas