2009-11-26 33 views
5

Tengo una pregunta relacionada con las técnicas de invalidación de caché ... Estoy tratando de implementar un mecanismo para mi sitio web, que invalida automáticamente el caché del navegador (css, imágenes ...). Quiero poder invalidar programáticamente la memoria caché del navegador cada vez que actualizo el sitio web (cambio de imágenes o estilos);ASP.NET - Invalidar el caché del navegador

Por ejemplo: para el lanzamiento actual, entre otros, el CSS y algunas de las imágenes han cambiado. En esta situación, quiero que una vez finalizada la actualización, cuando un usuario realiza una solicitud al sitio web, la memoria caché de su navegador se invalide automáticamente, forzando así la nueva descarga de las nuevas imágenes y estilos. Esto debe hacerse solo para la primera solicitud del cliente ... los siguientes deben recuperarse de la memoria caché (por lo que establecer el pragma sin caché está descartado).

Esto es lo que he intentado: en el controlador de eventos BeginRequest, he añadido las siguientes líneas: Response.Cache.SetCacheability (HttpCacheability.ServerAndPrivate); Response.Cache.SetETag ("\" e111293b17594f1487d136ea7e9314ac \ "");

esto configura el ETag en los encabezados de respuesta. Pensé que si cambio este ETag en cada lanzamiento y lo configuro en cada solicitud, el caché será invalidado, pero parece que no lo es. Utilicé los encabezados HTTP en vivo para ver los resultados y ETAG está configurado correctamente para la respuesta, pero el CSS y las imágenes todavía se toman de la memoria caché ...

Cualquier idea de cómo podría lograr esto, o si se puede lograr en absoluto?

¡Gracias de antemano!

Respuesta

5

Me he encontrado con problemas como este en el pasado. Desafortunadamente no pude encontrar una forma realmente buena de lograr esto, así que tuve que encontrar una solución. Yo sólo estaba tratando con este problema para los archivos CSS por lo que añade un parámetro de cadena de consulta adicional para cada referencia CSS, por ejemplo

<link rel="stylesheet" type="text/css" 
     href="default.css?buildnumber=<%= Buildnumber %>" /> 

El número de compilación se incrementa con cada nueva versión para que el navegador se vio obligado a ir a buscar a esta nueva archivo. No es una solución ideal, pero funcionó sin problemas.

+0

que es una buena idea, pero ¿qué pasa con las imágenes ... no es tan fácil colocar un param de consulta para cada imagen de referencia en el proyecto ... gracias por la respuesta – GeoXYZ

+0

Esto debería funcionar para las imágenes. Quizás si todas sus imágenes son controles de servidor, podría anular un evento de página, tal vez onrender, y encontrar todas las imágenes y anexar el parámetro url extra – Bob

+0

sí, sé que podría hacerlo, pero no es una buena práctica ... primero de todos, creo que tendría que hacer esto en todas las páginas con imágenes en ellos (porque no solo la página maestra tiene imágenes, sino que los controles del usuario también tienen imágenes); en segundo lugar, para automatizar este proceso (no tener que adaptar el código cada vez que agregue otro control de imagen en la página), tendría que repetir los controles de página y buscar solo controles de imagen y modificar la propiedad imageurl .. .y esto consume mucho tiempo, especialmente si el recuento de golpes para ese control es alto, lo que induce un golpe de rendimiento. – GeoXYZ

Cuestiones relacionadas