所有从IE发送的ajax调用都被Angular缓存了,我对所有后续调用都得到了一个304响应。虽然请求是一样的,但在我的情况下,响应是不一样的。我想禁用这个缓存。我尝试将缓存属性添加到$http。得到了,但还是没有用。如何解决这个问题?
当前回答
我所做的保证是这样的:
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";
}]);
为了保证所有方法的正确使用,我不得不合并上述两个解决方案,但你可以用get或其他方法替换common,即put, post, delete,以使其适用于不同的情况。
其他回答
你可以添加一个唯一的querystring(我相信这就是jQuery对cache: false选项所做的)到请求。
$http({
url: '...',
params: { 'foobar': new Date().getTime() }
})
一个可能更好的解决方案是,如果您可以访问服务器,那么您可以确保设置必要的头文件以防止缓存。如果你使用ASP。这个答案可能会有帮助。
这个问题是由于你说的IE缓存问题,你可以在IE调试模式下按f12测试它(这在调试模式下工作很好)。IE不会在每次页面调用时获取服务器数据,而是从缓存中获取数据。要禁用此功能,请执行以下任一操作:
在下面附加HTTP服务请求url
//之前(已发行)
this.httpService.get(this.serviceUrl + “/eAMobileService.svc/ValidateEngagmentName/” + engagementName , {})
//After (working fine)
这httpService得到(this。“服务+”/移动服务。svc/验证名称/ + engagementName + ?日期=“+新日期”。
禁用整个模块的缓存:-
$httpProvider.defaults.headers.common['Pragma'] = '无缓存';
一种选择是使用简单的方法,为每个请求添加时间戳,不需要清除缓存。
let c=new Date().getTime();
$http.get('url?d='+c)
上面的解决方案是可行的(通过在查询字符串中添加一个新的参数使url唯一),但我更喜欢解决方案建议[这里]:更好的方法防止IE缓存在AngularJS?,它在服务器级处理这个问题,因为它不是特定于IE。我的意思是,如果资源不应该被缓存,那就在服务器上做(这与使用的浏览器无关;这是资源的固有属性)。
例如,在使用JAX-RS的java中,以编程方式为JAX-RS v1或以声明方式为JAX-RS v2执行此操作。
我相信任何人都能弄清楚怎么做
我没有对每个GET-request都禁用缓存,而是在$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';
}]);