Ich habe ein ernstes Problem mit dem Zwischenspeichern von Internet Explorer-Ergebnissen aus einer JQuery Ajax-Anforderung.
Ich habe eine Kopfzeile auf meiner Webseite, die jedes Mal aktualisiert wird, wenn ein Benutzer zu einer neuen Seite navigiert. Sobald die Seite geladen ist, mache ich das
$.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");
Es werden nur Header-Informationen in die Seite eingefügt. Sie können es überprüfen, indem Sie auf www.wikipediamaze.com gehen und sich dann anmelden und ein neues Puzzle starten.
In jedem von mir getesteten Browser (Google Chrome, Firefox, Safari, Internet Explorer) funktioniert es hervorragend, außer im Internet Explorer . Alles wird beim ersten Mal in IE gut injiziert, aber danach wird es nicht einmal mehr angerufen /game/getpuzzleinfo
. Es ist, als hätte es die Ergebnisse zwischengespeichert oder so.
Wenn ich den Anruf in $.post("/game/getpuzzleinfo", ...
IE ändere , wird er gut angenommen. Aber dann hört Firefox auf zu arbeiten.
Kann jemand bitte etwas Licht ins Dunkel bringen, warum der IE meine $.get
Ajax-Anrufe zwischenspeichert?
AKTUALISIEREN
Gemäß dem folgenden Vorschlag habe ich meine Ajax-Anfrage in diese geändert, wodurch mein Problem behoben wurde:
$.ajax({
type: "GET",
url: "/game/getpuzzleinfo",
dataType: "json",
cache: false,
success: function(data) { ... }
});
quelle
Antworten:
IE ist bekannt für sein aggressives Caching von Ajax-Antworten. Während Sie jQuery verwenden, können Sie eine globale Option festlegen:
Dadurch fügt jQuery der Anforderungsabfragezeichenfolge einen zufälligen Wert hinzu, wodurch verhindert wird, dass der IE die Antwort zwischenspeichert.
Beachten Sie, dass wenn Sie andere Ajax-Aufrufe ausführen, bei denen Sie das Caching durchführen möchten, dies auch für diese deaktiviert wird. Wechseln Sie in diesem Fall zur Verwendung der Methode $ .ajax () und aktivieren Sie diese Option explizit für die erforderlichen Anforderungen.
Weitere Informationen finden Sie unter http://docs.jquery.com/Ajax/jQuery.ajaxSetup .
quelle
/
. Ändern Sie es in/index.php
oder was auch immer die vollständige URL sein könnte. Oder fügen Sie selbst einige gefälschte Parameter hinzu/?f=f
Wie bereits erwähnt,
GET
werden sie zwischengespeichert.Es gibt verschiedene Möglichkeiten, dies zu bekämpfen. Neben dem Ändern des Antwortheaders können Sie auch eine zufällig generierte Abfragezeichenfolgenvariable an das Ende der Ziel-URL anhängen. Auf diese Weise glaubt der IE, dass es sich bei jeder Anforderung um eine andere URL handelt.
Es gibt mehrere Möglichkeiten, dies zu tun (z. B. Verwendung
Math.random()
, Variation des Datums usw.).Hier ist eine Möglichkeit, wie Sie dies tun können:
quelle
Gets sind immer zwischenspeicherbar. Eine Strategie, die möglicherweise funktioniert, besteht darin, den Antwortheader zu bearbeiten und den Client anzuweisen, die Informationen nicht zwischenzuspeichern oder den Cache sehr bald abzulaufen.
quelle
Wenn Sie ashx page aufrufen, können Sie das Caching auf dem Server auch mit dem folgenden Code deaktivieren:
quelle
Das mache ich für Ajax-Anrufe:
es funktioniert ziemlich gut für mich.
quelle
NickFitz gibt eine gute Antwort, aber Sie müssen das Caching auch in IE9 deaktivieren. Um nur auf IE8 und IE9 abzuzielen, können Sie dies tun;
quelle
Die Antworten hier sind sehr hilfreich für diejenigen, die jQuery verwenden oder aus irgendeinem Grund direkt das xmlHttpRequest-Objekt verwenden ...
Wenn Sie den automatisch generierten Microsoft Service Proxy verwenden, ist dies nicht so einfach zu lösen.
Der Trick besteht darin, die Sys.Net.WebRequestManager.add_invokingRequest-Methode im Ereignishandler zu verwenden, um die Anforderungs-URL zu ändern:
Ich habe darüber gebloggt: http://yoavniran.wordpress.com/2010/04/27/ie-caching-ajax-results-how-to-fix/
quelle
Ich habe gerade einen Blog zu diesem Thema nur mit ExtJS geschrieben ( http://thecodeabode.blogspot.com/2010/10/cache-busting-ajax-requests-in-ie.html) ).
Das Problem war, dass ich bei der Verwendung eines bestimmten URL-Umschreibformats keine herkömmlichen Abfragezeichenfolgenparameter (? Param = value) verwenden konnte, sodass ich stattdessen den Cache-Busting-Parameter als veröffentlichte Variable geschrieben hatte ..... Ich hätte gedacht Die Verwendung von POST-Variablen ist etwas sicherer als die von GET, einfach weil viele MVC-Frameworks das Muster verwenden
Protokoll: // Host / Controller / Aktion / Parameter1 / Parameter2
und so geht die Zuordnung des Variablennamens zum Wert verloren und die Parameter werden einfach gestapelt ... also bei Verwendung eines GET-Cache-Buster-Parameters
dh Protokoll: // Host / Controller / Aktion / param1 / param2 / no_cache122300201
no_cache122300201 kann mit einem $ param3-Parameter verwechselt werden, der einen Standardwert haben kann
dh
öffentliche Funktionsaktion ($ param1, $ param2, $ param3 = "Standardwert") {//..//}
Bei POSTED-Cache-Bustern ist dies nicht möglich
quelle
Wenn Sie ASP.NET MVC verwenden, reicht es aus, diese Zeile über der Controller-Aktion hinzuzufügen:
quelle
IE hat das Recht, dieses Caching durchzuführen. Um sicherzustellen, dass das Element nicht zwischengespeichert wird, sollten die Überschriften entsprechend festgelegt werden.
Wenn Sie ASP.NET MVC verwenden, können Sie eine
ActionFilter
; inOnResultExecuted
, überprüfenfilterContext.HttpContext.Request.IsAjaxRequest()
. Wenn ja, setzen Sie den Ablauf-Header der Antwort:filterContext.HttpContext.Response.Expires = -1;
Gemäß http://www.dashbay.com/2011/05/internet-explorer-caches-ajax/ :
quelle