Wszystkie wywołania ajax, które są wysyłane z IE, są buforowane przez Angular i otrzymuję 304 response
dla wszystkich kolejnych wywołań. Chociaż żądanie jest takie samo, odpowiedź nie będzie taka sama w moim przypadku. Chcę wyłączyć tę pamięć podręczną. Próbowałem dodać cache attribute
do $ http.get, ale nadal nie pomogło. Jak rozwiązać ten problem?
javascript
caching
angularjs
Rahul
źródło
źródło
If-Modified-Since
marki header IIS + rzut iisnode 400 Bad Request dla każdego pliku html załadowane przezngInclude
angView
. Następujące dwa nagłówki naprawiły jednak dla mnie problem (ściągnąłem je z Chrome, który nie miał problemu z buforowaniem):$httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
$httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
If-Modified-Since = "0"
nagłówka powoduje uszkodzenie Tomcat (problem z analizą daty nagłówka, ponieważ0
nie jest to poprawna wartość RFC ). NaprawionoMon, 26 Jul 1997 05:00:00 GMT
zamiast tego używanie wartości .Możesz dołączyć do zapytania unikalny kwerenda (uważam, że to właśnie robi jQuery z opcją cache: false).
Być może lepszym rozwiązaniem jest, jeśli masz dostęp do serwera, możesz upewnić się, że ustawione są niezbędne nagłówki, aby zapobiec buforowaniu. Jeśli używasz
ASP.NET MVC
tej odpowiedzi, może pomóc.źródło
$http.get(url+ "?"+new Date().toString())
jest po prostu kolejną reprezentacją, bez użycia parametru, ale dodając go do ciągu zapytania.możesz dodać przechwytywacz.
powinieneś usunąć wiersze console.log po weryfikacji.
źródło
$log
na wypadek, gdybyś zapomniał je wyjąć.Po prostu dodałem trzy metatagi do index.html w projekcie kątowym, a problem pamięci podręcznej został rozwiązany w IE.
źródło
index.html
gdy zauważyliśmy, że IE11 buforuje żądania AJAX: / Ale konfigurowanie,$httpProvider
jak pokazano w innych odpowiedziach, działało dobrze.Duplikuję moją odpowiedź w innym wątku .
W Angular 2 i nowszych najłatwiejszym sposobem dodawania
no-cache
nagłówków przez przesłonięcieRequestOptions
:I odwołaj się do tego w swoim module:
źródło
If-Modified-Since
datę z daleka w przeszłości przy użyciu powyższej metody.)headers: req.headers .set('Cache-Control', 'no-cache') .set('Pragma', 'no-cache') .set('Expires', 'Sat, 01 Jan 2000 00:00:00 GMT')
Gwarantowany, który miałem pracować, był w następujący sposób:
Musiałem połączyć 2 z powyższych rozwiązań w celu zagwarantowania właściwego wykorzystania dla wszystkich metod, ale można zastąpić
common
zget
lub inna metoda czyliput
,post
,delete
aby dokonać tej pracy w różnych przypadkach.źródło
if (!$httpProvider.defaults.headers.get) { $httpProvider.defaults.headers.common = {}; }
["If-Modified-Since"] = "0"
jest nielegalne i generuje nieprawidłowe żądanie na niektórych zapleczach. to powinna być randka.Ta jedyna linia pomogła mi (Angular 1.4.8):
UPD: Problem polega na tym, że IE11 wykonuje agresywne buforowanie. Kiedy szukałem Fiddlera, zauważyłem, że w trybie F12 żądania wysyłają „Pragma = brak pamięci podręcznej”, a punkt końcowy jest wymagany za każdym razem, gdy odwiedzam stronę. Ale w trybie normalnym punkt końcowy został zażądany tylko raz przy pierwszej wizycie na stronie.
źródło
Aby uniknąć buforowania, jedną z opcji jest podanie innego adresu URL dla tego samego zasobu lub danych. Aby wygenerować inny adres URL, możesz dodać losowy ciąg zapytania na końcu adresu URL. Ta technika działa w przypadku zapytań JQuery, Angular lub innego typu ajax.
źródło
Rozumiem, że dołączam datetime jako liczbę losową:
źródło
Powyższe rozwiązanie będzie działać (uczynić adres URL unikalnym, dodając w zapytaniu nowy parametr), ale wolę zaproponować rozwiązanie [tutaj]: Lepszy sposób na zapobieganie pamięci podręcznej IE w AngularJS?, które obsługują to na poziomie serwera, ponieważ nie jest to specyficzne dla IE. Mam na myśli, że jeśli ten zasób nie powinien być buforowany, zrób to na serwerze (nie ma to nic wspólnego z używaną przeglądarką; jest ingerujący w zasób).
Na przykład w Javie z JAX-RS zrób to programowo dla JAX-RS v1 lub deklatacyjnie dla JAX-RS v2.
Jestem pewien, że ktoś wymyśli, jak to zrobić
źródło
To trochę za stare, ale: Rozwiązania takie są przestarzałe. Pozwól serwerowi obsługiwać pamięć podręczną lub nie pamięć podręczną (w odpowiedzi). Jedynym sposobem na zagwarantowanie braku buforowania (myślenie o nowych wersjach w produkcji) jest zmiana pliku js lub css za pomocą numeru wersji. Robię to za pomocą webpacka.
źródło
możesz także spróbować w swoim serwerze ustawić nagłówki, takie jak na przykład:
źródło
Prawidłowe rozwiązanie po stronie serwera: lepszy sposób zapobiegania pamięci podręcznej IE w AngularJS?
źródło
Ten problem wynika z problemu buforowania IE, jak powiedziałeś, możesz go przetestować w trybie debugowania IE, naciskając klawisz f12 (będzie działał dobrze w trybie debugowania). IIE nie pobierze danych serwera za każdym razem, gdy strona wywołuje, zajmuje dane z pamięci podręcznej. Aby to wyłączyć, wykonaj jedną z następujących czynności:
// Przed (wydany)
this.httpService.get (this.serviceUrl + "/eAMobileService.svc/ValidateEngagmentName/" + nazwa zaangażowania, {})
// Po (działa dobrze)
this.httpService.get (this.serviceUrl + "/eAMobileService.svc/ValidateEngagmentName/" + EngagementName + "? DateTime =" + new Date (). getTime () + '', {cache: false})
$ httpProvider.defaults.headers.common ['Pragma'] = 'no-cache';
źródło
Właśnie dodałem to do widoku i zaczęło działać w IE. Potwierdzony do pracy nad Angular 2.
źródło
Opcją jest zastosowanie prostego podejścia polegającego na dodawaniu znacznika czasu do każdego żądania bez potrzeby czyszczenia pamięci podręcznej.
źródło
Spróbuj tego, zadziałało dla mnie w podobnym przypadku: -
źródło