2012-01-24 12 views
6

Estoy implementando un servicio REST simple con el WCF Web API e intento establecer encabezados HTTP para caché de respuestas.El almacenamiento en caché de HTTP en la API web de WCF parece incoherente entre los navegadores

Para un GET simple como esto

http://localhost:49302/my/2 

las cabeceras de respuesta aspecto:

Server: ASP.NET Development Server/10.0.0.0 
Date: Tue, 24 Jan 2012 18:18:44 GMT 
X-AspNet-Version: 4.0.30319 
Content-Length: 233 
Cache-Control: max-age=120 
Vary: Accept 
Expires: Tue, 24 Jan 2012 18:20:44 GMT 
Last-Modified: Tue, 24 Jan 2012 18:18:15 GMT 
Content-Type: application/xml; charset=utf-8 

La intención es que el cliente debe almacenar en caché el recurso durante dos minutos.

Sin embargo, el uso de la API de Web WCF cliente de prueba, el comportamiento es consistente entre los diferentes navegadores:

  • En Firefox (9.0.1) la solicitud se almacena en caché, y la primera después de dos minutos es una nueva versión de el recurso mostrado. Este comportamiento es el esperado.
  • En Chrome (16.0.912.77 m) los encabezados de caché no se respetan en absoluto. Se está obteniendo una nueva versión del recurso para cada solicitud GET. Este comportamiento no es esperado (por mí, al menos).
  • En Internet Explorer (9) el comportamiento es el mismo que en Chrome.

¿Por qué Chrome y IE no respetan los encabezados de la caché?

¿Es un error en el WCF Web API Test Client?

+1

WCF Web API Test Client es muy nuevo, por lo que podría tener un error. ¿Puedes probarlo directamente con el navegador o escribir una pequeña página de prueba? – suing

Respuesta

4

El almacenamiento en la memoria caché es difícil de resolver. El hecho de que un navegador pueda ignorar las directivas de caché ciertamente no ayuda.

Según this document es decir, nunca en caché cualquier solicitud con una cabecera Vary contiene nada más que Accept-Encoding y User-Agent

Si puedo probar esto con un periodo de 15 segundos caché y me acaba de establecer la MaxAge y MustRevalidate parece para trabajar bien con IE9, Firefox y Chrome.

Web API HttpResponseMessage:

result = new HttpResponseMessage<Book>(book); 
result.Headers.CacheControl = new CacheControlHeaderValue(); 
result.Headers.CacheControl.MaxAge = TimeSpan.FromSeconds(15); 
result.Headers.CacheControl.MustRevalidate = true; 
return result; 

cabeceras de respuesta:

HTTP/1.1 200 OK 
Server: ASP.NET Development Server/10.0.0.0 
Date: Wed, 25 Jan 2012 09:13:32 GMT 
X-AspNet-Version: 4.0.30319 
Content-Length: 98 
Cache-Control: must-revalidate, max-age=15 
Content-Type: application/json; charset=utf-8 
Connection: Close 

No estoy seguro de la MustRevalidate es realmente necesario, pero se recomienda utilizarlo. Ver las especificaciones here.

+0

Esa es una idea bastante interesante acerca de los navegadores que ignoran las directivas de caché. Sin embargo, aunque he recortado mis encabezados para estar muy cerca de los que se publican aquí, todavía no veo Chrome o IE9 en el caché de la respuesta. –

+0

Resulta que las directivas de caché son solo una pista y el navegador puede ignorarlas.Usar must-revalidate es una sugerencia para que el navegador sea más estricto. No estoy seguro de qué es lo diferente. Estaba probando en localhost y no usando el cliente de prueba pero usé un botón en una página HTML normal con una llamada jQuery $ .getJSON(). – Maurice

2

Prueba para reemplazar localhost con "dominio real" por lo que WCF Test Client o Chrome/IE no tiene ningún truco especial para localhost.

+0

Esa fue en realidad una sugerencia bastante razonable, ya que no había pensado en eso, pero por desgracia no hace la diferencia. Todavía me estoy ejecutando en mi caja local, pero lo he intentado con mi nombre de máquina local (NETBIOS), así como con un nombre DNS "totalmente calificado". –

Cuestiones relacionadas