Tous les appels ajax envoyés depuis IE sont mis en cache par Angular et j'obtiens un 304 response
pour tous les appels suivants. Bien que la demande soit la même, la réponse ne sera pas la même dans mon cas. Je veux désactiver ce cache. J'ai essayé d'ajouter le cache attribute
à $ http.get mais cela n'a toujours pas aidé. Comment résoudre ce problème?
javascript
caching
angularjs
Rahul
la source
la source
If-Modified-Since
tête fait que IIS + iisnode lance 400 requêtes incorrectes pour chaque fichier html chargé viangInclude
etngView
. Les deux en-têtes suivants ont cependant résolu le problème pour moi (je les ai retirés de Chrome, qui n'avait pas le problème de mise en cache):$httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
$httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
If-Modified-Since = "0"
tête rompt Tomcat (problème avec l'analyse de la date de l'en-tête, car la0
valeur RFC n'est pas valide ). Correction de l'utilisation de la valeur à laMon, 26 Jul 1997 05:00:00 GMT
place.Vous pouvez soit ajouter une chaîne de requête unique (je crois que c'est ce que jQuery fait avec l'option cache: false) à la demande.
Une solution peut-être meilleure est que si vous avez accès au serveur, vous pouvez vous assurer que les en-têtes nécessaires sont définis pour empêcher la mise en cache. Si vous utilisez
ASP.NET MVC
cette réponse, cela pourrait vous aider.la source
$http.get(url+ "?"+new Date().toString())
est juste une autre représentation, sans utiliser de paramètre mais en l'ajoutant à la chaîne de requête.vous pouvez ajouter un intercepteur.
vous devez supprimer les lignes console.log après vérification.
la source
$log
au cas où vous oublieriez de les retirer.J'ai simplement ajouté trois balises META dans index.html sur un projet angulaire et le problème de cache a été résolu sur IE.
la source
index.html
lorsque nous avons remarqué qu'IE11 mettait en cache les demandes AJAX: / Mais la configuration$httpProvider
comme indiqué dans d'autres réponses a bien fonctionné.Dupliquer ma réponse dans un autre fil .
Pour Angular 2 et plus récent , la façon la plus simple d'ajouter des en-
no-cache
têtes en remplaçantRequestOptions
:Et référencez-le dans votre module:
la source
If-Modified-Since
une date dans le passé en utilisant la méthode ci-dessus.)headers: req.headers .set('Cache-Control', 'no-cache') .set('Pragma', 'no-cache') .set('Expires', 'Sat, 01 Jan 2000 00:00:00 GMT')
La garantie que je travaillais était quelque chose dans ce sens:
Je devais fusionner deux des solutions ci - dessus afin de garantir l'utilisation correcte pour toutes les méthodes, mais vous pouvez remplacer
common
parget
ou une autre méthode par exempleput
,post
,delete
pour faire ce travail pour les cas différents.la source
if (!$httpProvider.defaults.headers.get) { $httpProvider.defaults.headers.common = {}; }
["If-Modified-Since"] = "0"
est illégal et génère une mauvaise demande sur certains backends. ce devrait être une date.Cette seule ligne m'a aidé (Angular 1.4.8):
UPD: Le problème est qu'IE11 fait une mise en cache agressive. Lorsque je regardais Fiddler, j'ai remarqué qu'en mode F12, les requêtes envoyaient "Pragma = no-cache" et le point final était demandé à chaque fois que je visitais une page. Mais en mode normal, le point de terminaison n'a été demandé qu'une seule fois lors de ma première visite sur la page.
la source
Pour éviter la mise en cache, une option consiste à donner une URL différente pour la même ressource ou les mêmes données. Pour générer une URL différente, vous pouvez ajouter une chaîne de requête aléatoire à la fin de l'URL. Cette technique fonctionne pour les requêtes JQuery, Angular ou autre type ajax.
la source
Je le résout en ajoutant datetime comme un nombre aléatoire:
la source
La solution ci-dessus fonctionnera (rendre l'url unique en ajoutant dans la chaîne de requête un nouveau paramètre) mais je préfère la solution proposée [ici]: une meilleure façon de prévenir le cache IE dans AngularJS?, qui gère cela au niveau du serveur car il n'est pas spécifique à IE. Je veux dire, si cette ressource ne doit pas être mise en cache, faites-le sur le serveur (cela n'a rien à voir avec le navigateur utilisé; c'est intrinsèque à la ressource).
Par exemple, en java avec JAX-RS, faites-le par programme pour JAX-RS v1 ou de manière déclinative pour JAX-RS v2.
Je suis sûr que tout le monde saura comment le faire
la source
C'est un peu ancien mais: les solutions comme sont obsolètes. Laissez le serveur gérer le cache ou non le cache (dans la réponse). La seule façon de garantir l'absence de mise en cache (en pensant aux nouvelles versions en production) est de changer le fichier js ou css avec un numéro de version. Je fais cela avec webpack.
la source
vous pouvez également essayer dans votre service de définir des en-têtes comme par exemple:
la source
La solution correcte côté serveur: une meilleure façon de prévenir le cache IE dans AngularJS?
la source
Ce problème est dû au problème de mise en cache IE comme vous l'avez dit, vous pouvez le tester en mode de débogage IE en appuyant sur f12 (cela fonctionnera bien en mode débogage) .IE ne prendra pas les données du serveur à chaque fois que la page appelle, cela prend les données du cache. Pour désactiver cela, effectuez l'une des opérations suivantes:
// Avant (délivré un)
this.httpService.get (this.serviceUrl + "/eAMobileService.svc/ValidateEngagmentName/" + engagementName, {})
// Après (fonctionne bien)
this.httpService.get (this.serviceUrl + "/eAMobileService.svc/ValidateEngagmentName/" + engagementName + "? DateTime =" + new Date (). getTime () + '', {cache: false})
$ httpProvider.defaults.headers.common ['Pragma'] = 'no-cache';
la source
Je viens de l'ajouter à View et il a commencé à fonctionner sur IE. Confirmé de travailler sur Angular 2.
la source
Une option consiste à utiliser l'approche simple consistant à ajouter un horodatage à chaque demande, pas besoin de vider le cache.
la source
Essayez ceci, cela a fonctionné pour moi dans un cas similaire: -
la source