状态 200 OK(),角度承诺抛出错误——没有“访问控制允许来源”

Posted

技术标签:

【中文标题】状态 200 OK(),角度承诺抛出错误——没有“访问控制允许来源”【英文标题】:Status 200 OK(), angular promise throws error -- No 'Access-Control-Allow-Origin' 【发布时间】:2018-01-17 22:27:29 【问题描述】:

首先,cors 已启用并在 webapi 中工作,我可以通过从另一个控制器毫无问题地发出 post/get 请求来确认这一点,无论何时禁用 cors,我都无法再从服务器发布/获取数据。令牌也是如此,一旦我禁用 webapi 上的 cors,我就没有得到有效的响应。但现在我确实得到了有效的回应。

我正在尝试从 Web API 获取令牌。我使用角度资源和承诺。在提琴手我可以看到状态 200,所以我得到了一个令牌,JSON 说不记名令牌 = x,所以一切看起来都很好。邮递员也在工作。但是当我查看调试控制台时,我看到 promise 抛出了一个错误,即使 fiddler 和 postman 都向我显示了一个有效的 JSON 文件和一个状态 200。

// Controller
.controller('LoginCtrl', ['$scope', 'Token', function ($scope, Token) 
    $scope.login = function () Token.save('username=test123@test.com&password=Test123!!&grant_type=password')
            .$promise.then(function (response) 
            console.log(response);
        );
    ;
]);

在我的工厂里

.factory('Token', ['$resource', function ($resource) 
    return $resource(baseUrl + 'token', null, 
        save: 
            method: 'POST',
            headers: 
                'Content-Type': 'application/x-www-form-urlencoded',
                'Accept': '*/*'
            ,
        
    );
]);

我在开发者工具控制台中得到的响应是

可能未处理的拒绝:"data":null,"status":-1,"config":"method":"POST","transformRequest":[null],"transformResponse":[ null],"jsonpCallbackParam":"callback","headers":"Content-Type":"application/x-www-form-urlencoded","Accept":"/", "data":"username=test123@test.com&password=Test123!!&grant_type=password","url":"http://localhost:55126/token","statusText":""

我 100% 确定我从 /token 调用中获得了有效的 JSON 对象。提前致谢。


更新

XMLHttpRequest 无法加载 localhost:55126/token。请求的资源上不存在“Access-Control-Allow-Origin”标头。来源“本地主机:9000”;因此不允许访问。 angular.js:14642 –

可能未处理的拒绝:"data":null,"status":-1,"config":"method":"POST","transfor‌​mRequest":[null],"tr‌​ansformResponse": [nu‌​ll],"jsonpCallbackPa‌​ram":"callback","hea‌​ders":"Content-Type‌​":"application/x-www‌​-form-urlencoded","A‌​ccept":" /","data":"‌​username=test123@tes‌​t.com&password=Test1‌​23!!&grant_type=pass‌​word","url":"localho‌​st:55126/token";‌​ ,"statusText":""

这两个错误行紧接着弹出

【问题讨论】:

-1 状态通常意味着CORS 问题。浏览器阻止了 XHR,因为它违反了Same Origin Policy。 如果是 CORS 问题,我应该根本无法获取数据。我确实从服务器得到了(好的)响应,承诺只是不等待答案完成。我还在使用 Origin * 的后端使用 CORS,所以应该没问题。 是 200 响应 OPTIONS 飞行前请求吗?也许在那之后实际的 POST 被阻止了?开发者控制台的网络标签显示什么? XMLHttpRequest 无法加载 localhost:55126/token。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'localhost:9000' 不允许访问。 angular.js:14642 可能未处理的拒绝:"data":null,"status":-1,"config":"method":"POST","transformRequest":[null],"transformResponse" :[null],"jsonpCallbackParam":"callback","headers":"Content-Type":"application/x-www-form-urlencoded","Accept":"/" ,"data":"username=test123@test.com&password=Test123!!&grant_type=password","url":"localhost:55126/token","statusText":"" 【参考方案1】:

解决方案似乎与 CORS 相关。即使我安装了 NuGet Microsoft.AspNet.WebApi.Cors 并使用:

config.EnableCors(new EnableCorsAttribute("", "", "*"));

这有助于“正常”控制器请求,每当请求令牌时,我发现我必须安装 NuGet Microsoft.Owin.Cors 并使用:

app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

在应用程序的 web api 配置部分。感谢您的帮助。

【讨论】:

以上是关于状态 200 OK(),角度承诺抛出错误——没有“访问控制允许来源”的主要内容,如果未能解决你的问题,请参考以下文章

Breeze 错误消息“;”在 Chrome 中状态为 OK

在发生异常时使用服务抛出的不同代码覆盖 GraphQL 默认状态代码(200)

跨域请求被阻止,即使它以 200 ok 状态码响应

故意在承诺中抛出错误?

在承诺之外抛出错误

从 Fetch 中捕获 200 OK 以外的响应