状态 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","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 问题。浏览器阻止了 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