2009-03-21 13 views
7

Tengo un pequeño problema con el almacenamiento en caché de solicitudes mediante conexiones asíncronas NSURLConnection en el iPhone. No sé si he entendido algo de manera incorrecta, o si cacao está haciendo lo contrario a lo que se supone que debe hacer ...NSURLConnection, NSURLRequest y almacenamiento en memoria caché remota

La documentación para NSURLRequest dice que:

NSURLRequestReloadIgnoringLocalCacheData

Especifica que los datos para la carga de URL deben cargarse desde la fuente de origen. No se deben usar datos de caché existentes para satisfacer una solicitud de carga de URL.

y:

NSURLRequestReloadIgnoringLocalAndRemoteCacheData

Especifica que no sólo se debe ignorar los datos de la memoria caché local, pero que los proxies y otros productos intermedios deben ser instruidos para no tener en cuenta sus cachés la medida en que el protocolo permite .

Ahora, si envío un NSURLRequest con NSURLRequestReloadIgnoringLocalCacheData (que se supone hacer caso omiso de caché local, pero el uso de caché remota si está disponible), las cabeceras que se envían son:

 
GET /dashboard HTTP/1.1 
User-Agent: XBlip1.0 CFNetwork/422.15.2 Darwin/9.6.0 (i386) (iMac8%2C1) 
X-Blip-Api: 0.02 
Accept: application/json 
Authorization: Basic (...) 
Accept-Language: en-us 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Host: api.blip.pl 

y el estado se 200 OK Pero si uso NSURLRequestReloadIgnoringLocalAndRemoteCacheData, que se supone hacer caso omiso de las cachés locales y remotos, como su nombre indica, se añade un encabezado adicional:

 
If-None-Match: "d751713988987e9331980363e24189ce" 

Y la respuesta es 304 Not Modified. He comprobado el RFC HTTP, y por "If-None-Match" se dice que:

Si cualquiera de las etiquetas de la entidad coincide con la etiqueta entidad de la entidad que se habría devuelto en la respuesta a una solicitud GET similar (sin el encabezado If-None-Match) en ese recurso, (...) entonces el servidor NO DEBE realizar el método solicitado (...) En cambio, si el método de solicitud fue GET o HEAD, el servidor DEBERÍA responder con una respuesta 304 (Not Modified)

Así que parece que si uso NSURLRequestReloadIgnoringLocalAndRemoteCacheData, en lugar de ignorar la caché remota, cacao le dice al servidor remoto explícitamente que debe usa memoria caché remota, y si uso NSURLRequestReloadIgnoringLocalCacheData, no agrega esa línea y en efecto la memoria caché remota no se usa.

¿Qué está pasando exactamente aquí? ¿Me perdí algo, o Cocoa está configurando un encabezado incorrecto?

Respuesta

2

Al agregar el parámetro NSURLRequestReloadIgnoringLocalAndRemoteCacheData, está indicando a la memoria caché local y a los servidores proxy que pueden gestionar la solicitud entre su cliente y el servidor de destino que no deben devolver su propia versión de los datos de respuesta. Creo que el componente clave aquí es que es probable que RemoteCache sea un proxy e identifique que la solicitud siempre debe llegar al servidor real y no a una copia de proxy.

Añadiendo el parámetro "stupidly-long-named" está inferiendo que su aplicación ya tiene una copia previa de la solicitud y por lo tanto solo está interesada en recibir datos del servidor si ha cambiado, es por eso que está obteniendo una respuesta de "304 Not Modified" del servidor.

Este comportamiento parece contrario a la intuición ya que está instruyendo explícitamente al cliente que no use su propio caché, lo que implicaría que desearía descartar algo allí y ciertamente no lo usaría como referencia para las solicitudes posteriores. Creo que los parámetros de caché avanzada se proporcionan para permitir que el desarrollador maneje su propio nivel de almacenamiento en caché, es decir. ser notificado si los datos no han sido actualizados en el servidor para que puedan evitar el reprocesamiento innecesario.

1

Tenga en cuenta que el "proxies y otros productos intermedios" parte. Solo está evitando cachés que no residen en el servidor original. El servidor original todavía puede devolver un 304.

10

De la documentación:

Especifica que no sólo se debe ignorar los datos de la memoria caché local, pero que los proxies y otros productos intermedios deben ser instruidos para no tener en cuenta sus cachés hasta el momento como lo permite el protocolo

De NSURLRequest.h (10,5 SDK)

Especifica que no sólo se debe ignorar los datos de la memoria caché local, pero que los proxies y otros productos intermedios deben ser instruidos para no tener en cuenta sus cachés la medida en que el protocolo permite. Sin implementar.

notar la diferencia: Unimplemented

hora de informar del fallo ...

Cuestiones relacionadas