2009-03-24 14 views
7

¿Alguno de los navegadores actualmente populares tiene problemas particulares de almacenamiento en caché * XMLHttpRequest respuestas que debo tener en cuenta?¿Qué navegadores tienen problemas para almacenar en caché las respuestas XMLHTTPRequest?

Me gustaría poder incluir consultas XMLHttpRequest en cada página como un método de carga dinámica de contenido (es decir, JSON) o comportamiento (como eval() ed Javascript) relevante para el tipo de página, pero quería hacer Asegúrese de que los recursos que recibe del servidor se puedan almacenar en caché, si el servidor envió los encabezados correctos.

Me preocupa leer this article which mentions que los navegadores como Firefox 1.1 no almacenan en caché ningún contenido obtenido a través de XMLHTTPRequest, y que siempre solicita que se envíen nuevos datos completamente (con Cache-Control y sin If-Modified-Since) independientemente de encabezados enviados por el servidor.

Obviamente, este artículo es muy antiguo, ni siquiera recuerdo un Firefox 1.1; ¿Cuáles son las consideraciones que debo hacer para los navegadores populares actuales y hay algún truco para cuando específicamente quiero respuestas en caché?

** Para aclarar mi pregunta, me refiero al caché del lado del cliente, donde el servidor emite información de frescura (en forma de una directiva Cache-Control: max-age o Expires:) y el navegador almacena una copia de la respuesta en su caché junto con una fecha de caducidad, de modo que las solicitudes futuras para el mismo recurso emitidas desde páginas subsiguientes se pueden satisfacer desde la memoria caché del navegador sin necesidad de ningún contacto con el servidor. Todos los navegadores principales hacen esto correctamente para la mayoría de los contenidos, pero he escuchado que Firefox no puede hacer esto para el contenido de XMLHttpRequest. Lo que estoy preguntando es si alguien sabe de casos en que alguno de los navegadores modernos no almacena respuestas en caché según la especificación al usar XMLHttpRequest. *

+0

es mejor y más consistente para controlarlo en su JS. si no necesita actualizar, no consulte. – Javier

+0

¿Qué quieres decir? ¿Podría dar un ejemplo? Me gustaría poder obtener algo del servidor, pero si el navegador lo tiene en su memoria caché de una página anterior y no está caducado, para evitar que provoque un viaje al servidor. Todavía quiero los datos, no puedo simplemente no consultar. – thomasrutter

Respuesta

11

Mark Nottingham tiene an excellent set of functional tests que demuestran el comportamiento de caché del navegador XMLHttpRequest. Cargue la página en los navegadores que quiera admitir y determine qué técnicas puede y con qué no puede confiar para que su respuesta se almacene en caché.

+0

Muchas gracias por eso. Parece bastante prometedor, ya que Firefox pasó esas pruebas de 'frescura' (incluidas todas las que tienen 'Expire'). – thomasrutter

+3

, la secuencia de comandos ya no parece funcionar. probado en Chrome. muchos avisos de seguridad en la consola –

4

Aunque algunos navegadores tienen diferentes valores predeterminados (de manera predeterminada, IE almacenará los resultados en caché de AJAX solicitudes, pero Firefox, por defecto, no), todos los navegadores que conozco obedecerán a los encabezados http, como Cache-Control. Así que simplemente configure los encabezados de almacenamiento en caché correctamente para su aplicación.

Aquí se muestra un ejemplo:

public ActionResult SomeAction() 
    { 
     var model = [...]; 
     Response.AddHeader("Cache-Control", "no-cache"); 
     return Json(model); 
    } 

Ahora IE y Firefox serán tanto comportan de la misma; nunca almacenarán en caché los resultados de la acción.

+0

no estaría tan seguro. La memoria caché de IE6 es demasiado agresiva. Me han mordido varias veces. si no desea que las consultas se almacenen en la memoria caché, agregue postfijo arandom a la URL (un parámetro no utilizado está bien) – Javier

+0

Desafortunadamente, esto es lo opuesto a lo que necesito. Me gustaría asegurarme de que la respuesta se almacena en caché. Es decir, si el navegador puede satisfacer la solicitud con una respuesta anterior de su caché que no ha caducado, me gustaría que lo hiciera y evitar y necesitar hacer una solicitud al servidor de origen. – thomasrutter

+1

Javier, eso funcionará, pero delega la política de caché al cliente, que en mi humilde opinión es el lugar equivocado. –

Cuestiones relacionadas