Angular almacena en caché todas las llamadas ajax que se envían desde el IE y obtengo un 304 response
para todas las llamadas posteriores. Aunque la solicitud es la misma, la respuesta no será la misma en mi caso. Quiero deshabilitar este caché. Intenté agregar el cache attribute
$ http.get pero aún así no ayudó. ¿Cómo se puede resolver este problema?
javascript
caching
angularjs
Rahul
fuente
fuente
If-Modified-Since
encabezado hace que IIS + iisnode arroje 400 solicitudes incorrectas por cada archivo html cargado a través dengInclude
yngView
. Sin embargo, los siguientes dos encabezados solucionaron el problema (los saqué de Chrome, que no tenía el problema de almacenamiento en caché):$httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
$httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
If-Modified-Since = "0"
encabezado rompe Tomcat (problema con el análisis de la fecha del encabezado, ya0
que no es un valor válido RFC ). Solucionado el uso de valor en suMon, 26 Jul 1997 05:00:00 GMT
lugar.Puede agregar una cadena de consulta única (creo que esto es lo que hace jQuery con el caché: opción falsa) a la solicitud.
Una solución quizás mejor es si tiene acceso al servidor, entonces puede asegurarse de que los encabezados necesarios estén configurados para evitar el almacenamiento en caché. Si está utilizando
ASP.NET MVC
esta respuesta, podría ayudar.fuente
$http.get(url+ "?"+new Date().toString())
es solo otra representación, sin usar el parámetro pero agregándolo a la cadena de consulta.Puede agregar un interceptor.
debe eliminar las líneas de console.log después de verificar.
fuente
$log
en caso de que se olvide de sacarlos.Simplemente agregué tres metaetiquetas en index.html en el proyecto angular, y el problema de caché se resolvió en IE.
fuente
index.html
cuando notamos que IE11 estaba almacenando en caché las solicitudes de AJAX: / Pero la configuración$httpProvider
como se muestra en otras respuestas funcionó bien.Duplicando mi respuesta en otro hilo .
Para Angular 2 y posteriores , la forma más fácil de agregar
no-cache
encabezados anulandoRequestOptions
:Y referencialo en tu módulo:
fuente
If-Modified-Since
una fecha en el pasado usando el método anterior.)headers: req.headers .set('Cache-Control', 'no-cache') .set('Pragma', 'no-cache') .set('Expires', 'Sat, 01 Jan 2000 00:00:00 GMT')
El garantizado que tenía trabajando era algo así:
Tuve que fusionar 2 de las soluciones anteriores para garantizar el uso correcto de todos los métodos, pero puede reemplazarlo
common
conget
otro métodoput
, es decirpost
,delete
para que esto funcione en diferentes casos.fuente
if (!$httpProvider.defaults.headers.get) { $httpProvider.defaults.headers.common = {}; }
["If-Modified-Since"] = "0"
es ilegal y genera una solicitud incorrecta en algunos servidores. Debería ser una cita.Esta única línea me ayudó (Angular 1.4.8):
UPD: El problema es que IE11 hace un almacenamiento en caché agresivo. Cuando estaba buscando en Fiddler, noté que en el modo F12 las solicitudes envían "Pragma = no-cache" y se solicita un punto final cada vez que visito una página. Pero en modo normal, el punto final se solicitó solo una vez la primera vez que visité la página.
fuente
Para evitar el almacenamiento en caché, una opción es proporcionar una URL diferente para el mismo recurso o datos. Para generar una URL diferente, puede agregar una cadena de consulta aleatoria al final de la URL. Esta técnica funciona para JQuery, Angular u otro tipo de solicitudes ajax.
fuente
Lo resuelvo agregando datetime como un número aleatorio:
fuente
La solución anterior funcionará (haga que la url sea única agregando en la cadena de consulta un nuevo parámetro), pero prefiero que la solución proponga [aquí]: ¿ Mejor manera de prevenir el caché de IE en AngularJS? , que manejan esto a nivel de servidor, ya que no es específico de IE. Quiero decir, si ese recurso no debe almacenarse en caché, hágalo en el servidor (esto no tiene nada que ver con el navegador utilizado; es intrínseco al recurso).
Por ejemplo, en java con JAX-RS, hágalo programáticamente para JAX-RS v1 o declarativamente para JAX-RS v2.
Estoy seguro de que alguien descubrirá cómo hacerlo
fuente
Esto es un poco viejo pero: las soluciones como son obsoletas. Deje que el servidor maneje el caché o no el caché (en la respuesta). La única forma de garantizar que no haya almacenamiento en caché (pensando en nuevas versiones en producción) es cambiar el archivo js o css con un número de versión. Hago esto con webpack.
fuente
También puede intentar en su servicio configurar encabezados como, por ejemplo:
fuente
La solución correcta del lado del servidor: ¿ Una mejor manera de prevenir el caché de IE en AngularJS?
fuente
Este problema se debe al problema de almacenamiento en caché de IE, como dijiste, puedes probarlo en modo de depuración de IE presionando f12 (esto funcionará bien en modo de depuración) .IE no tomará los datos del servidor cada vez que llame la página. Los datos del caché. Para deshabilitar esto, realice una de las siguientes acciones:
// Antes (emitió uno)
this.httpService.get (this.serviceUrl + "/eAMobileService.svc/ValidateEngagmentName/" + engagementName, {})
// Después (trabajando bien)
this.httpService.get (this.serviceUrl + "/eAMobileService.svc/ValidateEngagmentName/" + engagementName + "? DateTime =" + new Date (). getTime () + '', {cache: false})
$ httpProvider.defaults.headers.common ['Pragma'] = 'no-cache';
fuente
Acabo de agregar esto a View y comenzó a funcionar en IE. Confirmado para trabajar en Angular 2.
fuente
Una opción es utilizar el enfoque simple de agregar una marca de tiempo con cada solicitud sin necesidad de borrar el caché.
fuente
Prueba esto, funcionó para mí en un caso similar:
fuente