2009-02-18 8 views
5

¡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.

Respuesta

3

He encontrado lo siguiente en el código fuente de ASP.NET MVC:

public virtual void RenderView(ViewContext viewContext) { 
     // TODO: Remove this hack. Without it, the browser appears to always load cached output 
     viewContext.HttpContext.Response.Cache.SetExpires(DateTime.Now); 
     ViewUserControlContainerPage containerPage = new ViewUserControlContainerPage(this); 
     // Tracing requires Page IDs to be unique. 
     ID = Guid.NewGuid().ToString(); 

     RenderViewAndRestoreContentType(containerPage, viewContext); 
    } 

Así que esto explica por qué mi cabecera Expires siempre es la hora actual. Sin embargo, yo realmente no creo que esto es lo que se tropezar Chrome robaba creé la página más sencilla posible de la siguiente manera, y Chrome se sigue felizmente va de vuelta al servidor y me da un 200

public partial class test : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     TimeSpan cacheDuration = TimeSpan.FromSeconds(33); 
     var cache = Response.Cache; 

     cache.SetCacheability(HttpCacheability.Public); 
     cache.SetExpires(DateTime.Now.Add(cacheDuration)); 
     cache.SetMaxAge(cacheDuration); 
     cache.AppendCacheExtension("must-revalidate, proxy-revalidate"); 
    } 
} 
+0

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 –

1

tengo prácticamente llegamos a la conclusión de que es Chrome haciendo algo REALMENTE REALISTA con el almacenamiento en caché.

Lo simplifiqué al nivel más bajo posible - obteniendo jQuery del servidor de Google.

Tecleé:

http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js 

a Chrome, y El violinista se le ocurrió la siguiente solicitud:

Requests started at: 22:58:00:7756 
Responses completed at: 22:58:03:5020 
Total Sequence time: 00:00:02.7263880 
DNS Lookup time: 531ms 
TCP/IP Connect time: 63ms 

RESPONSE CODES 
-------------- 
HTTP/200: 1 

Las cabeceras fueron los siguientes (nota Expira es de 1 año después de hoy):

Cache-Control: public, max-age=31536000 
Date: Wed, 18 Feb 2009 06:58:01 GMT 
Expires: Thu, 18 Feb 2010 06:58:01 GMT 
Vary: Accept-Encoding 

y luego esperé unos pocos conds y presiona enter - en la misma pestaña. El violinista se le ocurrió otra solicitud ** 200 *:

Requests started at: 22:58:09:2516 
Responses completed at: 22:58:12:3999 
Total Sequence time: 00:00:03.1482360 

RESPONSE CODES 
-------------- 
HTTP/200: 1 

Y las cabeceras eran:

Cache-Control: public, max-age=31536000 
Date: Wed, 18 Feb 2009 06:58:09 GMT 
Expires: Thu, 18 Feb 2010 06:58:09 GMT 
Vary: Accept-Encoding 

Obviamente esto no es lo que estaba esperando.

- Aceptar-Codificar fue lo mismo para ambas solicitudes.

- una tercera solicitud me dio un 304

Esto fue en una nueva instalación de Chrome que nunca había hecho ningún desarrollo - y en el que sólo había acabo de instalar Fiddler por primera hora.

No puedo esperar a que alguien me explique eso. Por ahora me estoy rindiendo, creo que mi código de caché y expiración está bien. Además ASP.NET MVC parece forzar que Expires sea la hora actual. Esto obviamente no es un factor en mi ejemplo de google.

Creo que Chrome es demasiado inteligente y tiene que ser un error. Estoy en la versión 1.0.154.48.

Cuestiones relacionadas