$ Http kampinio IE talpyklos problema

Visi „Ajax“ skambučiai, siunčiami iš IE, talpinami „Angular“, ir gaunu 304 response į visus paskesnius skambučius. Nors prašymas yra tas pats, mano atveju atsakymas nebus toks pats. Noriu išjungti šią talpyklą. Bandžiau pridėti cache attribute „$ http.get“, tačiau ji vis tiek nepadėjo. Kaip išspręsti šią problemą?

244
19 апр. Rahul nustatė balandžio 19 d 2013-04-19 09:17 '13, 9:17, 2013-04-19 09:17
@ 17 atsakymų

Vietoj to, kad išjungtumėte kiekvieno „GET“ užklausos talpyklą, išjungsiu jį visame pasaulyje „$ httpProvider“:

 myModule.config(['$httpProvider', function($httpProvider) { //initialize get if not there if (!$httpProvider.defaults.headers.get) { $httpProvider.defaults.headers.get = {}; } // Answer edited to include suggestions from comments // because previous version of code introduced browser-related errors //disable IE ajax request caching $httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT'; // extra $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache'; $httpProvider.defaults.headers.get['Pragma'] = 'no-cache'; }]); 
429
04 нояб. atsakymas pateikiamas lapkričio 4 d. 2013-11-04 18:48 '13, 18:48, 2013-11-04 18:48

Galite pridėti unikalią užklausos eilutę (manau, kad tai yra tai, ką jQuery daro su talpykla: false parametras) užklausai.

 $http({ url: '...', params: { 'foobar': new Date().getTime() } }) 
border=0

Galbūt geriausias sprendimas yra, jei turite prieigą prie serverio, tada galite įsitikinti, kad būtinos antraštės yra sukonfigūruotos, kad būtų išvengta talpyklos. Jei naudojate ASP.NET MVC šį atsakymą , jis gali padėti.

68
19 апр. atsakymas duotas Martin 19 Bal 2013-04-19 09:54 '13, 9:54, 2013-04-19 09:54

Galite pridėti pertraukiklį.

 myModule.config(['$httpProvider', function($httpProvider) { $httpProvider.interceptors.push('noCacheInterceptor'); }]).factory('noCacheInterceptor', function () { return { request: function (config) { console.log(config.method); console.log(config.url); if(config.method=='GET'){ var separator = config.url.indexOf('?') === -1 ? '?' : ' config.url = config.url+separator+'noCache=' + new Date().getTime(); } console.log(config.method); console.log(config.url); return config; } }; }); 

Po patikrinimo turite ištrinti „console.log“ eilutes.

28
24 янв. Atsakymas pateikiamas tirpalo pattnaik 24 jan. 2014-01-24 00:00 '14 - 0:00 2014-01-24 00:00

Aš tiesiog pridėjau tris meta žymeles į index.html kampiniame projekte, o talpyklos problema buvo išspręsta IE.

 <meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="no-cache"> <meta http-equiv="Expires" content="Sat, 01 Dec 2001 00:00:00 GMT"> 
14
06 июня '14 в 23:12 2014-06-06 23:12 atsakymas pateikiamas rtato 06 birželio 14 d. 23:12 2014-06-06 23:12

Mano atsakymo pasikartojimas kitoje temoje .

Corner 2“ ir naujesnės versijos paprasčiausias būdas pridėti „ no-cache antraštes yra panaikinti „ RequestOptions :

 import { Injectable } from '@angular/core'; import { BaseRequestOptions, Headers } from '@angular/http'; @Injectable() export class CustomRequestOptions extends BaseRequestOptions { headers = new Headers({ 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Expires': 'Sat, 01 Jan 2000 00:00:00 GMT' }); } 

Ir kreipkitės į savo modulį:

 @NgModule({ ... providers: [ ... { provide: RequestOptions, useClass: CustomRequestOptions } ] }) 
12
15 июня '17 в 10:20 2017-06-15 10:20 atsakymą pateikė Vitaliy Ulantikov birželio 15 d. 17:10 10:20 2017-06-15 10:20

Garantuota, kad dirbau, buvo kažkas panašaus:

 myModule.config(['$httpProvider', function($httpProvider) { if (!$httpProvider.defaults.headers.common) { $httpProvider.defaults.headers.common = {}; } $httpProvider.defaults.headers.common["Cache-Control"] = "no-cache"; $httpProvider.defaults.headers.common.Pragma = "no-cache"; $httpProvider.defaults.headers.common["If-Modified-Since"] = "Mon, 26 Jul 1997 05:00:00 GMT"; }]); 

Turėjau derinti 2 iš pirmiau minėtų sprendimų, kad būtų užtikrintas tinkamas visų metodų naudojimas, bet jūs galite pakeisti common su get ar kitu būdu, ty, put , delete , delete kad atliktumėte šį darbą įvairiais atvejais.

9
21 нояб. atsakymas pateikiamas marksyzm . 2014-11-21 14:55 '14, 14:55, 2014-11-21 14:55

Ši eilutė man padėjo (kampinis 1.4.8):

 $httpProvider.defaults.headers.common['Pragma'] = 'no-cache'; 

UPD: Problema ta, kad IE11 atlieka agresyvų talpyklą. Pažvelgus į „Fiddler“, pastebėjau, kad F12 režimu užklausos siunčiamos „Pragma = no cache“, o galutinis taškas yra prašomas kiekvieną kartą, kai apsilankau puslapyje. Bet įprastu režimu, pirmą kartą apsilankius puslapyje, galutinis taškas buvo prašomas tik vieną kartą.

7
03 дек. atsakymą pateikė „ yamaxim 03“. 2015-12-03 13:42 '15, 13:42 pm 2015-12-03 13:42

Nusprendžiau leisti įtraukti datą ir laiką kaip atsitiktinį skaičių:

 $http.get("/your_url?rnd="+new Date().getTime()).success(function(data, status, headers, config) { console.log('your get response is new!!!'); }); 
6
25 июля '14 в 13:46 2014-07-25 13:46 atsakymą pateikė khichar.anil, liepos 25 d. 14, 13:46 2014-07-25 13:46

Kad būtų išvengta talpyklos, viena parinktis yra pateikti skirtingą URL tą patį šaltinį ar duomenis. Jei norite sukurti kitą URL, prie URL pabaigos galite pridėti atsitiktinės užklausos eilutę. Šis metodas taikomas „jQuery“, „Angular“ ar kitiems „ajax“ užklausoms.

 myURL = myURL +"?random="+new Date().getTime(); 
6
22 апр. Razan Paul atsakymas balandžio 22 d 2016-04-22 08:37 '16 at 8:37 am 2016-04-22 08:37

Aukščiau aprašytas sprendimas veiks (padarys URL unikalų, pridedant naują užklausą), bet aš norėčiau pasiūlyti sprendimą [čia]: koks yra geriausias būdas užkirsti kelią IE talpyklai „AngularJS“? tai tvarko serverio lygmeniu, nes tai netaikoma IE. Aš turiu galvoje, jei šis šaltinis neturėtų būti talpinamas, tai atlikite serveryje (tai neturi nieko bendro su naudojama naršykle, jis neprieštarauja ištekliams).

Pavyzdžiui, java su JAX-RS, vykdykite JAX-RS v1 programinį arba JAX-RS v2.

Esu tikras, kad kiekvienas supras, kaip tai padaryti.

4
06 июня '14 в 16:09 2014-06-06 16:09 atsakymas pateikiamas gudrininkui 06.06.14 val. 16:09 2014-06-06 16:09

Taip pat galite pabandyti nustatyti antraštes savo paslaugoje, pavyzdžiui, pavyzdžiui:

 ... importuoti {Injectable} iš „@ angular / core“; importuoti {HttpClient, HttpHeaders, HttpParams} iš „@ angular / common / http“; ...  @Injectable () eksporto klasė „MyService“ { privačios antraštės: „HttpHeaders“; konstruktorius (privatus http: HttpClient ..)  { this.headers = nauji „HttpHeaders“ () .append („Turinio tipas“, „taikymas /„ Json “) .append („Priimti“, „taikymas /„ Json “) .append („Kalbų kultūra“, tai.pavadinimai>
1
01 февр. atsakymas pateikiamas Nr . 2018-02-01 13:30 '18, 13.30 val. 2018-02-01 13:30

Radau geriausią sprendimą: geriausias būdas užkirsti kelią IE talpyklai „AngularJS“?

Dėl tingumo, tai yra sprendimas:

 [OutputCache(NoStore = true, Duration = 0, VaryByParam = "None")] public ActionResult Get() { // return your response } 
1
17 янв. Atsakymą pateikė Vladislav Kurkotov sausio 17 d. 2015-01-17 19:08 '15, 19:08, 2015-01-17 19:08

Tai šiek tiek senamadiškas, tačiau sprendimai atrodo pasenę. Tegul serveris apdoroja talpyklą arba ne talpyklą (atsakydamas). Vienintelis būdas užtikrinti, kad nėra talpyklos (galvojant apie naujas gamybos versijas), yra pakeisti js arba css failą su versijos numeriu. Tai padarysiu naudodamasis „webpack“.

1
16 янв. Atsakymą pateikė Jens Alenius sausio 16 d. 2017-01-16 20:39 '17 at 8:39 2017-01-16 20:39
 meta http-equiv="Cache-Control" content="no-cache" 

Aš ką tik pridėjau prie peržiūros ir pradėjau dirbti su IE. Patvirtinta dirbti kampiniame 2.

0
18 янв. Atsakymą pateikė Bharat Raj 18 sausis 2017-01-18 06:47 '17 at 6:47 2017-01-18 06:47

Visada naudokite paprastą metodą, jei norite pridėti laiko žymą su kiekvienu prašymu, nereikia išvalyti talpyklos

  let c=new Date().getTime(); $http.get('url?d='+c) 
0
27 сент. atsakymas pateikiamas Vaimeo 27 sep . 2017-09-27 11:33 '17 at 11:33 2017-09-27 11:33

Ši problema susijusi su IE spartinimo problema, kaip minėjote, galite ją išbandyti IE derinimo režimu, paspausdami f12 (tai veiks gerai derinimo režimu) .IE nepriims serverio duomenų kiekvieną kartą, kai skambinama, ji ima duomenis iš talpyklą Jei norite tai išjungti, atlikite vieną iš šių veiksmų:

  • pridėkite http su užklausos paslaugos URL

// Iki (vienas išduodamas)

this.httpService.get (this.serviceUrl + "/eAMobileService.svc/ValidateEngagmentName/" + engagementName, {})

// Po (veikia gerai)

this.httpService.get (this.serviceUrl + "/eAMobileService.svc/ValidateEngagmentName/" + engagementName + "? DateTime =" + nauja data (). getTime () + '', {cache: false})

  1. išjungti viso modulio talpyklą: -

$ httpProvider.defaults.headers.common ['Pragma'] = 'ne-talpykla';

0
27 окт. atsakymas pateikiamas Nijas_kp 27 okt. 2016-10-27 16:51 '16 at 16:51 pm 2016-10-27 16:51

Išbandykite, jis man vienu atveju dirbo:

 $http.get("your api url", { headers: { 'If-Modified-Since': '0', "Pragma": "no-cache", "Expires": -1, "Cache-Control": "no-cache, no-store, must-revalidate" } }) 
-1
14 мая '18 в 14:32 2018-05-14 14:32 atsakė Mayank Parnamiui gegužės 18 d. 18 val. 14:32 val. 2018-05-14 14:32

Kiti klausimai apie žymes arba Ask a question