Alle Ajax-Anrufe, die vom IE gesendet werden, werden von Angular zwischengespeichert, und ich erhalte eine 304 response
für alle nachfolgenden Anrufe. Obwohl die Anfrage dieselbe ist, wird die Antwort in meinem Fall nicht dieselbe sein. Ich möchte diesen Cache deaktivieren. Ich habe versucht, das cache attribute
zu $ http.get hinzuzufügen, aber es hat trotzdem nicht geholfen. Wie kann dieses Problem behoben werden?
javascript
caching
angularjs
Rahul
quelle
quelle
If-Modified-Since
Header lässt IIS + iisnode 400 Bad Request für jede durchngInclude
und geladene HTML-Datei auslösenngView
. Die folgenden zwei Header haben das Problem für mich behoben (ich habe sie aus Chrome gezogen, wo es kein Caching-Problem gab):$httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
$httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
If-Modified-Since = "0"
Headers unterbricht Tomcat (Problem beim Parsen des Headerdatums, da der0
Wert RFC nicht gültig ist ).Mon, 26 Jul 1997 05:00:00 GMT
Stattdessen mit Wert behoben.Sie können der Anforderung entweder einen eindeutigen Querystring anhängen (ich glaube, das macht jQuery mit der Option cache: false).
Eine vielleicht bessere Lösung ist, wenn Sie Zugriff auf den Server haben, können Sie sicherstellen, dass die erforderlichen Header festgelegt sind, um das Caching zu verhindern. Wenn Sie
ASP.NET MVC
diese Antwort verwenden, kann dies hilfreich sein.quelle
$http.get(url+ "?"+new Date().toString())
ist nur eine andere Darstellung, ohne Parameter zu verwenden, sondern sie der Abfragezeichenfolge hinzuzufügen.Sie können einen Abfangjäger hinzufügen.
Sie sollten die Zeilen console.log nach der Überprüfung entfernen.
quelle
$log
falls Sie vergessen, sie herauszunehmen.Ich habe einfach drei Meta-Tags in index.html für ein Winkelprojekt hinzugefügt, und das Cache-Problem wurde im IE behoben.
quelle
index.html
als wir bemerkten, dass IE11 AJAX-Anfragen zwischenspeichert: / Aber die Konfiguration$httpProvider
wie in anderen Antworten gezeigt funktionierte einwandfrei .Dupliziere meine Antwort in einem anderen Thread .
Für Angular 2 und höher ist der einfachste Weg,
no-cache
Header durch Überschreiben hinzuzufügenRequestOptions
:Und verweisen Sie in Ihrem Modul darauf:
quelle
If-Modified-Since
mit der obigen Methode ein Datum weit in der Vergangenheit einstellen könnte .)headers: req.headers .set('Cache-Control', 'no-cache') .set('Pragma', 'no-cache') .set('Expires', 'Sat, 01 Jan 2000 00:00:00 GMT')
Die garantierte Arbeit, die ich hatte, war etwas in dieser Richtung:
Ich hatte zwei der oben genannten Lösungen zusammenführen , um die korrekte Verwendung für alle Methoden zu gewährleisten, aber Sie können ersetzen
common
mitget
oder einem anderen Verfahren , dhput
,post
,delete
diese Arbeit für verschiedene Fälle zu machen.quelle
if (!$httpProvider.defaults.headers.get) { $httpProvider.defaults.headers.common = {}; }
["If-Modified-Since"] = "0"
ist illegal und generiert an einigen Backends eine Bad Request. Es sollte ein Datum sein.Diese einzige Zeile hat mir geholfen (Angular 1.4.8):
UPD: Das Problem ist, dass IE11 aggressives Caching ausführt. Als ich mich mit Fiddler befasste, bemerkte ich, dass im F12-Modus Anfragen "Pragma = kein Cache" senden und bei jedem Besuch einer Seite ein Endpunkt angefordert wird. Im normalen Modus wurde der Endpunkt jedoch beim ersten Besuch der Seite nur einmal angefordert.
quelle
Um ein Caching zu vermeiden, besteht eine Option darin, unterschiedliche URLs für dieselbe Ressource oder dieselben Daten anzugeben. Um eine andere URL zu generieren, können Sie am Ende der URL eine zufällige Abfragezeichenfolge hinzufügen. Diese Technik funktioniert für JQuery-, Angular- oder andere Ajax-Anforderungen.
quelle
Ich habe es gelöst, indem ich datetime als Zufallszahl angehängt habe:
quelle
Die obige Lösung funktioniert (machen Sie die URL eindeutig, indem Sie im Querystring einen neuen Parameter hinzufügen), aber ich bevorzuge den Lösungsvorschlag [hier]: Besserer Weg, um den IE-Cache in AngularJS zu verhindern? , die dies auf Serverebene behandeln, da es nicht spezifisch für IE ist. Ich meine, wenn diese Ressource nicht zwischengespeichert werden soll, tun Sie dies auf dem Server (dies hat nichts mit dem verwendeten Browser zu tun; es ist für die Ressource von zentraler Bedeutung).
Zum Beispiel in Java mit JAX-RS programmgesteuert für JAX-RS v1 oder deklarativ für JAX-RS v2.
Ich bin sicher, jeder wird herausfinden, wie es geht
quelle
Das ist ein bisschen zu alt, aber: Lösungen wie sind veraltet. Lassen Sie den Server den Cache behandeln oder nicht (in der Antwort). Die einzige Möglichkeit, kein Caching zu gewährleisten (über neue Versionen in der Produktion nachzudenken), besteht darin, die js- oder css-Datei mit einer Versionsnummer zu ändern. Ich mache das mit Webpack.
quelle
Sie können auch in Ihrem Dienst versuchen, Header festzulegen, wie zum Beispiel:
quelle
Die richtige serverseitige Lösung: Besserer Weg, um den IE-Cache in AngularJS zu verhindern?
quelle
Dieses Problem ist auf das IE-Caching-Problem zurückzuführen, das Sie gesagt haben. Sie können es im IE-Debug-Modus testen, indem Sie f12 drücken (dies funktioniert im Debug-Modus einwandfrei) .IE nimmt die Serverdaten nicht bei jedem Aufruf der Seite auf die Daten aus dem Cache. Führen Sie einen der folgenden Schritte aus, um dies zu deaktivieren:
// Vorher (ausgestellt)
this.httpService.get (this.serviceUrl + "/eAMobileService.svc/ValidateEngagmentName/" + EngagementName, {})
// Nachher (funktioniert gut)
this.httpService.get (this.serviceUrl + "/eAMobileService.svc/ValidateEngagmentName/" + EngagementName + "? DateTime =" + new Date (). getTime () + '', {cache: false})
$ httpProvider.defaults.headers.common ['Pragma'] = 'kein Cache';
quelle
Ich habe dies gerade zu View hinzugefügt und es begann im IE zu arbeiten. Bestätigt für Angular 2.
quelle
Eine Option besteht darin, den einfachen Ansatz zu verwenden, bei jeder Anforderung einen Zeitstempel hinzuzufügen, ohne dass der Cache geleert werden muss.
quelle
Versuchen Sie dies, es hat bei mir in einem ähnlichen Fall funktioniert: -
quelle