AngularJS $http 从失败的 CORS 请求返回状态码 0

Posted

技术标签:

【中文标题】AngularJS $http 从失败的 CORS 请求返回状态码 0【英文标题】:AngularJS $http returns status code 0 from failed CORS request 【发布时间】:2014-10-19 19:10:49 【问题描述】:

好的,我已经找遍了这个。基本上我们使用的是跨域请求的 $http 请求。我们的服务器允许域,当请求返回 200 时,一切正常。但是,无论何时我们的服务器返回一个错误,500、401 等等,Angular 都会认为这是一个 CORS 问题。

我使用 Fiddler 调试了响应以验证我的服务器正在返回 500,但 Angular 会阻塞它。

这是请求:

       var params = 
            url: "fakehost/example",
            method: 'GET',
            headers: 
                "Authorization": "Basic encodedAuthExample"
            
        ;

       $http(params).then(
            function (response)  // success 

            ,
            function (error)  // error 
                 // error.status is always 0, never includes data error msg
            );

然后在控制台中,我会看到这个:

XMLHttpRequest 无法加载 fakehost/example。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'mylocalhost:5750' 不允许访问。

然而,在提琴手中,真正的反应是:

HTTP/1.1 500 Internal Server Error
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Tue, 26 Aug 2014 12:18:17 GMT
Content-Length: 5683

"errorId":null,"errorMessage":"Index was outside the bounds of the array.","errorDescription":"Stack trace here"

我正在使用 AngularJS v1.2.16

【问题讨论】:

确认一下,error.data 属性未定义? 不是未定义,而是responseError拦截器中的整个响应是:Object data: "", status: 0, headers: function, config: Object, statusText: "" 另外,如果我故意发送失败的授权,状态码和数据会正确返回,所以它必须是 500 错误和 CORS 请求的组合:data: Object, status: 401,标头:函数,配置:对象,状态文本:“未授权” 【参考方案1】:

我想我找到了答案,看来您必须在您的 asp.net 管道中注入正确的 CORS 标头,如 here 所述。

【讨论】:

啊,你是男/女。这让我记忆犹新,我想我们立即实现了它,但它丢失了。非常感谢。 我在使用 OAuth 时也来到了这里。我以为我与 CORS 无关,但是当用户注销并且我的带有 JS 的页面仍然从浏览器缓存中提供时,它是第一个收到 302 的 XHR。我打算处理它,但结果是Angular 跟随它进入 OAuth 提供者的登录页面,这变成了一个跨站点请求(理所当然地被禁止),并且在错误处理程序中的 status = 0 让我感到惊讶。 @acg 我无法控制服务器代码来更改响应标头。在这种情况下,有什么方法可以让角度了解真实状态代码 我在这方面发布了一个新问题***.com/questions/31312703/…

以上是关于AngularJS $http 从失败的 CORS 请求返回状态码 0的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS 中的跨域 HTTP 请求失败

启用从 AngularJS 到 Jersey 的 CORS 发布请求

来自 jQuery 的 CORS 成功但使用 AngularJs 失败

FireFox的Angularjs CORS失败

Angular 跨域请求 CORS 失败,但节点 http.get() 成功返回

从 angularjs 调用 REST 服务时本地主机上的 CORS 问题