Todas as chamadas ajax enviadas do IE são armazenadas em cache pelo Angular e recebo um 304 response
para todas as chamadas subseqüentes. Embora a solicitação seja a mesma, a resposta não será a mesma no meu caso. Eu quero desativar esse cache. Eu tentei adicionar o cache attribute
$ http.get, mas ainda assim não ajudou. Como esse problema pode ser resolvido?
javascript
caching
angularjs
Rahul
fonte
fonte
If-Modified-Since
cabeçalho faz com que o IIS + iisnode lance 400 solicitações incorretas para cada arquivo html carregado comngInclude
engView
. Os dois cabeçalhos a seguir corrigiram o problema para mim (eu os tirei do Chrome, que não apresentava o problema de armazenamento em cache):$httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
$httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
If-Modified-Since = "0"
cabeçalho interrompe o Tomcat (problema com a análise da data do cabeçalho, pois o0
valor RFC não é válido ). Corrigido usando valorMon, 26 Jul 1997 05:00:00 GMT
.Você pode acrescentar uma string de consulta exclusiva (acredito que é isso que o jQuery faz com a opção cache: false) à solicitação.
Talvez uma solução melhor seja, se você tiver acesso ao servidor, verifique se os cabeçalhos necessários estão definidos para impedir o armazenamento em cache. Se você estiver usando
ASP.NET MVC
esta resposta, pode ajudar.fonte
$http.get(url+ "?"+new Date().toString())
é apenas outra representação, sem usar o parâmetro, mas adicionando-o à string de consulta.você pode adicionar um interceptador.
você deve remover as linhas console.log após a verificação.
fonte
$log
lo caso se esqueça de retirá-los.Simplesmente adicionei três metatags no index.html no projeto angular e o problema de cache foi resolvido no IE.
fonte
index.html
arquivo quando notamos que o IE11 estava armazenando em cache solicitações AJAX: / Mas a configuração$httpProvider
conforme mostrado em outras respostas funcionou bem.Duplicando minha resposta em outro tópico .
Para Angular 2 e versões mais recentes , a maneira mais fácil de adicionar
no-cache
cabeçalhos substituindoRequestOptions
:E referencie-o no seu módulo:
fonte
If-Modified-Since
com alguns data longe no passado usando o método acima descrito.)headers: req.headers .set('Cache-Control', 'no-cache') .set('Pragma', 'no-cache') .set('Expires', 'Sat, 01 Jan 2000 00:00:00 GMT')
O garantido que eu tinha trabalhado era algo nesse sentido:
Eu tive que mesclar 2 das soluções acima, a fim de garantir o uso correto para todos os métodos, mas você pode substituir
common
porget
ou outro métodoput
, ou sejapost
,delete
para fazer isso funcionar em casos diferentes.fonte
if (!$httpProvider.defaults.headers.get) { $httpProvider.defaults.headers.common = {}; }
["If-Modified-Since"] = "0"
é ilegal e gera uma solicitação incorreta em alguns back-ends. deve ser uma data.Essa única linha me ajudou (Angular 1.4.8):
UPD: O problema é que o IE11 faz cache agressivo. Quando eu estava olhando para o Fiddler, notei que, no modo F12, as solicitações estão enviando "Pragma = no-cache" e o endpoint é solicitado toda vez que visito uma página. Mas, no modo normal, o terminal foi solicitado apenas uma vez na primeira vez em que visitei a página.
fonte
Para evitar o armazenamento em cache, uma opção é fornecer URL diferente para o mesmo recurso ou dados. Para gerar um URL diferente, você pode adicionar uma sequência de consulta aleatória ao final do URL. Essa técnica funciona para solicitações JQuery, Angular ou outro tipo de ajax.
fonte
Eu resolvo acrescentando datetime como um número aleatório:
fonte
A solução acima funcionará (torne o URL exclusivo adicionando na querystring um novo parâmetro), mas eu prefiro a proposta de solução [aqui]: Melhor maneira de impedir o cache do IE no AngularJS? , que lidam com isso no nível do servidor, pois não é específico para o IE. Quero dizer, se esse recurso não deve ser armazenado em cache, faça-o no servidor (isso não tem nada a ver com o navegador usado; é intrínseco ao recurso).
Por exemplo, em java com JAX-RS, faça-o programaticamente para JAX-RS v1 ou declativamente para JAX-RS v2.
Tenho certeza que alguém vai descobrir como fazê-lo
fonte
Isso é um pouco antigo, mas: Soluções como estão obsoletas. Deixe o servidor manipular o cache ou não o cache (na resposta). A única maneira de garantir nenhum armazenamento em cache (pensando em novas versões em produção) é alterar o arquivo js ou css com um número de versão. Eu faço isso com o webpack.
fonte
Além disso, você pode tentar em seu serviço definir cabeçalhos como por exemplo:
fonte
A solução correta, do lado do servidor: melhor maneira de impedir o cache do IE no AngularJS?
fonte
Este problema ocorre devido ao problema de armazenamento em cache do IE, como você disse, você pode testá-lo no modo de depuração do IE pressionando f12 (isso funcionará bem no modo de depuração). os dados do cache. Para desabilitar isso, siga um destes procedimentos:
// Antes (emitido um)
this.httpService.get (this.serviceUrl + "/eAMobileService.svc/ValidateEngagmentName/" + EngagementName, {})
// Depois (funcionando bem)
this.httpService.get (this.serviceUrl + "/eAMobileService.svc/ValidateEngagmentName/" + EngagementName + "? DateTime =" + nova data (). getTime () + '', {cache: false})
$ httpProvider.defaults.headers.common ['Pragma'] = 'sem cache';
fonte
Acabei de adicionar isso ao View e ele começou a trabalhar no IE. Confirmado para trabalhar no Angular 2.
fonte
Uma opção é usar a abordagem simples de adicionar um carimbo de data / hora a cada solicitação, sem a necessidade de limpar o cache.
fonte
Tente isso, funcionou para mim em um caso semelhante: -
fonte