Almacenamiento en caché inesperado de AJAX resultados en IE8


Estoy teniendo un problema serio con los resultados de almacenamiento en caché de Internet Explorer de una solicitud Ajax jQuery.

Tengo un encabezado en mi página web que se actualiza cada vez que un usuario navega a una nueva página. Una vez que se carga la página hago esto

$.get("/game/getpuzzleinfo", null, function(data, status) {
    var content = "<h1>Wikipedia Maze</h1>";
    content += "<p class='endtopic'>Looking for <span><a title='Opens the topic you are looking for in a separate tab or window' href='" + data.EndTopicUrl + "' target='_blank'>" + data.EndTopic + "<a/></span></p>";
    content += "<p class='step'>Step <span>" + data.StepCount + "</span></p>";
    content += "<p class='level'>Level <span>" + data.PuzzleLevel.toString() + "</span></p>";
    content += "<p class='startover'><a href='/game/start/" + data.PuzzleId.toString() + "'>Start Over</a></p>";

    $("#wikiheader").append(content);

}, "json");

Simplemente inyecta información de encabezado en la página. Puedes comprobarlo yendo a www.wikipediamaze.com y luego iniciar sesión e iniciar un nuevo rompecabezas.

En todos los navegadores que he probado (Google Chrome, Firefox, Safari, Internet Explorer) funciona muy bien excepto en IE. Todo se inyecta muy bien en IE la primera vez pero después de eso ni siquiera hace la llamada a /game/getpuzzleinfo. Es como si hubiera guardado en caché los resultados o algo así.

Si cambio la llamada a $.post("/game/getpuzzleinfo", ... IE la recoge bien. Pero entonces Firefox deja de funcionar.

¿Puede alguien arrojar algo de luz sobre esto en cuanto a por qué IE está almacenando en caché mis llamadas $.get ajax?

ACTUALIZACIÓN

Según la sugerencia a continuación, he cambié mi solicitud ajax a esto, lo que solucionó mi problema:

$.ajax({
    type: "GET",
    url: "/game/getpuzzleinfo",
    dataType: "json",
    cache: false,
    success: function(data) { ... }
});
Author: hippietrail, 2009-06-18

10 answers

IE es conocido por su almacenamiento en caché agresivo de respuestas Ajax. A medida que utiliza jQuery, puede establecer una opción global:

$.ajaxSetup({
    cache: false
});

Que hará que jQuery agregue un valor aleatorio a la cadena de consulta de la solicitud, evitando así que IE almacene la respuesta en caché.

Tenga en cuenta que si tiene otras llamadas Ajax en curso donde desea almacenar en caché, esto también lo deshabilitará para esas llamadas. En ese caso, cambie a usar el $.método ajax() y habilita esa opción explícitamente para peticiones.

Véase http://docs.jquery.com/Ajax/jQuery.ajaxSetup para más información.

 176
Author: NickFitz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-18 16:31:02

Como marr75 mencionado, GET's se almacenan en caché.

Hay un par de maneras de combatir esto. Además de modificar el encabezado de la respuesta, también puede agregar una variable de cadena de consulta generada aleatoriamente al final de la URL de destino. De esta manera, IE pensará que es una URL diferente cada vez que se solicita.

Hay varias maneras de hacer esto (como usar Math.random(), una variación en la fecha, etc.).

Aquí hay una manera de hacerlo:

var oDate = new Date();
var sURL = "/game/getpuzzleinfo?randomSeed=" + oDate.getMilliseconds();
$.get(sURL, null, function(data, status) {
    // your work
});
 8
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:29:36

Los Gets son siempre cacheables. Una estrategia que puede funcionar es editar el encabezado de la respuesta y decirle al cliente que no almacene la información en caché o que expire la caché muy pronto.

 3
Author: marr75,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-18 16:19:22

Si está llamando a ashx page, también puede deshabilitar el almacenamiento en caché en el servidor con el siguiente código:

context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
context.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 
 2
Author: Andrej Benedik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-30 09:36:35

Esto es lo que hago para llamadas ajax:

var url = "/mypage.aspx";
// my other vars i want to add go here
url = url + "&sid=" + Math.random();
// make ajax call

Funciona bastante bien para mí.

 1
Author: Jason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-18 16:36:07

NickFitz da una buena respuesta, pero también tendrás que desactivar el almacenamiento en caché en IE9. Con el fin de apuntar solo IE8 e IE9 usted podría hacer esto;

<!--[if lte IE 9]>
<script>
    $.ajaxSetup({
        cache: false
    });
</script>
<![endif]-->
 1
Author: Stuart Hallows,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-16 17:39:36

Las respuestas aquí son muy útiles para aquellos que usan jQuery o por alguna razón usan directamente el objeto XMLHttpRequest...

Si está utilizando el proxy de servicio de Microsoft generado automáticamente, no es tan fácil de resolver.

El truco es usar el método Sys.Net.WebRequestManager.add_invokingRequest en el controlador de eventos cambiar la url de la solicitud:

networkRequestEventArgs._webRequest._url = networkRequestEventArgs._webRequest._url + '&nocache=' + new Date().getMilliseconds(); 

He blogueado sobre esto: http://yoavniran.wordpress.com/2010/04/27/ie-caching-ajax-results-how-to-fix /

 0
Author: poeticGeek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-27 15:08:46

Acaba de escribir un blog sobre este tema exacto solo usando ExtJS ( http://thecodeabode.blogspot.com/2010/10/cache-busting-ajax-requests-in-ie.html )

El problema era que, como estaba usando un formato de reescritura de url específico, no podía usar parámetros de cadena de consulta convencionales (?param = value), así que tuve que escribir el parámetro cache busting como una variable publicada en su lugar..... Yo habría pensado que el uso de variables POST son un poco más seguro que OBTENER, simplemente porque una gran cantidad de marcos MVC utilizan el patrón

Protocolo: / / host / controller/action/param1 / param2

Y así se pierde la asignación de nombre de variable a valor, y los parámetros simplemente se apilan... así que cuando se utiliza un parámetro GET cache buster

Es decir, protocolo: / / host / controller/action/param1/param2 / no_cache122300201

No_cache122300201 se puede confundir con un parámetro param param3 que podría tener un valor predeterminado

Es decir,

Acción de función pública (param param1, param param2, param param3 = " default valor") { //..// }

No hay posibilidad de que eso suceda con los busters de caché PUBLICADOS

 0
Author: Ben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-06 06:16:00

Si está utilizando Asp.net MVC, es suficiente añadir esta línea encima de la acción del controlador

     [OutputCache(NoStore=true, Duration = 0, VaryByParam = "None")]
        public ActionResult getSomething()

{
}
 0
Author: batmaci,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-06 06:58:18

IE está en su derecho de hacer este almacenamiento en caché; para asegurarse de que el elemento no se almacena en caché, las cabeceras deben establecerse en consecuencia.

Si está utilizando ASP.NET MVC, puede escribir un ActionFilter; en OnResultExecuted, marque filterContext.HttpContext.Request.IsAjaxRequest(). Si es así, establezca el encabezado expire de la respuesta: filterContext.HttpContext.Response.Expires = -1;

Según http://www.dashbay.com/2011/05/internet-explorer-caches-ajax/:

Algunas personas prefieren usar el encabezado Cache - Control: no - cache en lugar de caduca. Aquí está la diferencia:
Cache-Control: no-cache – absolutamente NO caching
Caduca:-1-el navegador" por lo general " se pone en contacto con el Servidor web para actualizaciones a esa página a través de un condicional Solicitud If-Modified-Since. Sin embargo, la página permanece en la caché del disco y se utiliza en situaciones apropiadas sin entrar en contacto con el telecontrol Servidor web, como cuando los botones ATRÁS y ADELANTE se utilizan para acceda al historial de navegación o cuando el navegador esté en modo sin conexión.

 -1
Author: Mark Sowul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-05 19:24:02