Angular IEcaching问题$ http

从IE发送的所有ajax调用都被Angularcaching,并且我得到了一个对所有后续调用的304 response 。 虽然要求是一样的,但是对我来说这个回应是不一样的。 我想禁用这个caching。 我试着将cache attribute添加到$ http.get,但仍然没有帮助。 这个问题怎么解决?

我没有为每个GET请求禁用caching,而是在$ 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'; }]); 

您可以追加一个唯一的查询string(我相信这是jQuery做的与caching:false选项)的请求。

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

一个可能更好的解决scheme是,如果你有权访问服务器,那么你可以确保设置必要的头文件来防止caching。 如果您使用ASP.NET MVC 这个答案可能会有所帮助。

你可以添加一个拦截器。

 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; } }; }); 

validation后,您应该删除console.log行。

我只是在angular项目的index.html中添加了三个元标记,并在IE上解决了caching问题。

 <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"> 

我曾经工作过的保证书是这样的:

 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"] = "0"; }]); 

为了保证所有方法的正确使用,我必须合并上述解决scheme中的两个,但是您可以将其replace为get或其他方法即putpostdelete以使其适用于不同的情况。

我得到它解决了附加date时间作为一个随机数字:

 $http.get("/your_url?rnd="+new Date().getTime()).success(function(data, status, headers, config) { console.log('your get response is new!!!'); }); 

这条线帮助了我(Angular 1.4.8):

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

UPD:问题是IE11做积极的caching。 当我查看Fiddler时,我注意到在F12模式下,请求发送“Pragma = no-cache”,每次访问页面时都会请求端点。 但是在正常模式下,当我访问该页面时,第一次只请求了一次端点。

对于Angular 2和更新版本 ,添加头文件的最简单方法是覆盖Http服务使用的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' }); } 

并在你的模块中引用它:

 @NgModule({ ... providers: [ ... { provide: RequestOptions, useClass: CustomRequestOptions } ] }) 

为了避免caching,一个选项是为相同的资源或数据提供不同的URL。 要生成不同的URL,可以在URL的末尾添加一个随机查询string。 这种技术适用于JQuery,Angular或其他types的Ajax请求。

 myURL = myURL +"?random="+new Date().getTime(); 

上面的解决scheme将工作(通过在查询string中添加一个新的参数使URL唯一),但我更喜欢解决schemebuild议[这里]: 更好的方法来阻止在AngularJS的IEcaching? ,这在服务器级别处理,因为它不是特定于IE。 我的意思是,如果不应该caching资源,请在服务器上执行(这与使用的浏览器无关;对资源来说是内在的)。

例如,在使用JAX-RS的java中,通过编程的方式为JAX-RS v1或JAX-RS v2声明。

我相信任何人都会知道如何去做

我find了更好的解决scheme: 在AngularJS中阻止IEcaching的更好方法?

对于懒惰的人来说,这是一个解决scheme:

 [OutputCache(NoStore = true, Duration = 0, VaryByParam = "None")] public ActionResult Get() { // return your response } 

这个问题是由于IEcaching的问题,正如你所说的,你可以在IEdebugging模式下按f12进行testing(这在debugging模式下可以正常工作).IE在每次页面调用时都不会收到服务器数据,来自caching的数据。 要禁用此function,请执行以下任一操作:

  1. 在你的http服务请求url中附加以下内容

//之前(发出一个)

this.httpService.get(this.serviceUrl +“/eamobileService.svc/ValidateEngagmentName/”+ engagementName,{})

//之后(工作正常)

this.httpService.get(this.serviceUrl +“/eAMobileService.svc/ValidateEngagmentName/”+ engagementName +“?DateTime =”+ new Date()。getTime()+'',{cache:false})

  1. 禁用整个模块的caching: –

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

这是有点老,但:解决scheme已经过时了。 让服务器处理caching或不caching(在响应中)。 保证没有caching的唯一方法(思考生产中的新版本)是使用版本号来更改js或css文件。 我用webpack做这个。

 meta http-equiv="Cache-Control" content="no-cache" 

我刚刚添加到视图,它开始在IE浏览器上工作。 确认在Angular 2上工作。

总是使用一个简单的方法添加时间戳每个请求不需要清除caching

  let c=new Date().getTime(); $http.get('url?d='+c)