134 votos

Caching inesperado de los resultados de AJAX en IE8

Estoy teniendo un grave problema con Internet Explorer almacenamiento en caché de los resultados de JQuery, Ajax.

Me han encabezado en mi página web, que se actualiza cada vez que un usuario navega a una página nueva. Una vez cargada la página, debo hacer 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='http://stackoverflow.com/game/start/" + data.PuzzleId.toString() + "'>Start Over</a></p>";

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

}, "json");

Simplemente inyecta el encabezado de la información en la página. Usted puede comprobarlo yendo a www.wikipediamaze.com y, a continuación, iniciar sesión y comenzar un nuevo puzzle.

En todos los navegadores que he probado (Google Chrome, Firefox, Safari, Internet Explorer) funciona muy bien , excepto en IE. Todo se inyecta bien en IE el primer tiempo , pero después de que él nunca hace la llamada a /game/getpuzzleinfo. Es como se ha almacenado en caché los resultados o algo.

Si puedo cambiar la llamada a $.post("/game/getpuzzleinfo", ... IE recoge muy bien. Pero, a continuación, Firefox se cierra de trabajo.

Por favor alguien puede arrojar algo de luz sobre este tema de por qué IE es de almacenamiento en caché mi $.get de las llamadas ajax?

ACTUALIZACIÓN

Por la sugerencia de abajo, he cambiado mi petición ajax a este, que se solucionó mi problema:

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

176voto

NickFitz Puntos 14977

Es decir, es notorio por su caché agresivo de respuestas Ajax. Como estás usando jQuery, puede establecer una opción global:

$.ajaxSetup({
    cache: false
});

que hará de jQuery para agregar un valor aleatorio a la petición de cadena de consulta, lo que impide es decir, de almacenar en caché la respuesta.

Tenga en cuenta que si usted tiene otras llamadas Ajax en donde desea que el almacenamiento en caché, esta se desactivará para aquellos demasiado. En ese caso, cambie a utilizar el $.ajax() método y activar esa opción explícita para la necesaria solicitudes.

Ver http://docs.jquery.com/Ajax/jQuery.ajaxSetup para obtener más información.

8voto

Tom Puntos 5872

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

Hay un par de maneras de luchar contra esto. Aparte de la modificación de la cabecera de respuesta, también puede añadir un generada aleatoriamente de la cadena de consulta de la variable al final de las URL. De esta manera, es decir, pensará que se trata de un URL diferente cada vez que se solicita.

Hay varias formas de hacer esto (tales como el uso de Math.random(), una variación en la fecha, etc.).

He aquí una forma de hacerlo:

var oDate = new Date();
var sURL = "/game/getpuzzleinfo?randomSeed=" + oDate.getMilliseconds();
$.get(sURL, null, function(data, status) {
    // your work
});

3voto

marr75 Puntos 4127

Obtiene son siempre cacheable. Una estrategia que puede funcionar es editar la cabecera de respuesta y decirle al cliente que no almacenar en caché la información o al expirar el caché muy pronto.

2voto

Andrej Benedik Puntos 31

Si usted está llamando página ashx también puede desactivar el almacenamiento en caché en el servidor con el siguiente código:

 context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
context.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 
 

1voto

Jason Puntos 20255

esto es lo que hago para las 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í.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X