¡Muy confundido sobre el encabezado 'Caduca' aquí! A veces funciona como se esperaba, y algunas veces no.Caduca los encabezados al realizar pruebas en Chrome
Estoy usando el siguiente código para establecer mis encabezados de caducidad. Tenga en cuenta que esto se está haciendo con ASP.NET en un atributo personalizado de MVC, que no es realmente relevante aquí, pero explica de dónde viene el 'filterContext'
.
HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
TimeSpan cacheDuration = TimeSpan.FromSeconds(Duration);
// my own custom header so we know what time it was
filterContext.HttpContext.Response.AddHeader("CurrentTime", DateTime.Now.ToString());
cache.SetCacheability(HttpCacheability.Public);
cache.SetExpires(DateTime.Now.Add(cacheDuration));
cache.SetMaxAge(cacheDuration);
cache.AppendCacheExtension("must-revalidate, proxy-revalidate");
Esto a veces me dará las cabeceras de la siguiente manera:
Cache-Control: public, must-revalidate, proxy-revalidate, max-age=413
Date: Wed, 18 Feb 2009 05:24:19 GMT
Expires: Wed, 18 Feb 2009 05:21:12 GMT
CurrentTime: 2/17/2009 9:21:12 PM
veces como esto:
Cache-Control: public, must-revalidate, proxy-revalidate, max-age=600
Date: Wed, 18 Feb 2009 05:27:55 GMT
Expires: Wed, 18 Feb 2009 05:27:55 GMT
CurrentTime: 2/17/2009 9:27:55 PM
Estoy funcionando todo a través violinista y viendo a ver cuando se vuelven a solicitarse cosas y cuando provienen de la memoria caché del navegador.
Ahora lo raro es que en IE el almacenamiento en caché siempre funciona como se esperaba. El enlace a mi método de acción ASP.NET MVC aparece en Fiddler y luego, cuando hago clic nuevamente en ese mismo enlace, proviene de la memoria caché.
Sin embargo, en Chrome algunas veces, y otras veces, no provienen de la memoria caché. Al venir de la caché me refiero a ninguna solicitud HTTP adicional.
Por ejemplo, un enlace de la siguiente manera:
http://ipv4.fiddler:62669/gallery/mainimage/2
vendrán de caché en IE, pero volver con un 200 en cromo. Entonces, a veces en Chrome, viene del caché. He intentado vaciar el caché del navegador y volver a intentarlo, el mismo resultado cada vez.
¿Chrome está tratando de hacer algo 'inteligente' y solo falla miserablemente - o necesito un encabezado adicional?
Lo que me pregunto es si tiene algo que ver con el hecho de que la fecha de mi encabezado Expires
en realidad nunca más en el futuro. si miro los encabezados de google para su hosted jQuery file veo que los encabezados son los siguientes (con caduca aquí en 2010 - un año en el futuro).
Cache-Control: public, max-age=31536000
Date: Wed, 18 Feb 2009 05:44:53 GMT
Expires: Thu, 18 Feb 2010 05:44:53 GMT
Should not Expires actually be in the future ??
De acuerdo con la HTTP spec:
Si la respuesta incluye tanto una Expira cabecera y una directiva máximo de edad, la directiva máximo de edad anula el Expira cabecera, incluso si el Expira cabecera es más restrictivo Esta regla permite que un servidor de origen proporcione, para una respuesta determinada, un tiempo de expiración más largo a una caché HTTP/1.1 (o posterior) que a una caché HTTP/1.0 . Esto podría ser útil si ciertas cachés HTTP/1.0 calculan incorrectamente edades o tiempos de caducidad, quizás debido a a relojes desincronizados.
Por lo tanto, parece que Chrome debe respetar la directiva de máxima edad, incluso si 'Caduca' es la misma que la hora actual, pero no parece estar haciendo eso.
Incluso agregué <% = DateTime.Now.ToString()%> a esta página aspx, y la ejecuté a través de la red y todavía regresó CADA VEZ con 200 y actualicé la hora. pero en IE fue almacenado en caché durante 33 segundos. hecho un desastre –