我有一个简单的ASP.Net WebAPI服务,它在POST / PUT上分配一个静态变量并返回GET上的值:
private static State Repo = null;
public State Get()
{
return Repo;
}
public void Post(State value)
{
Repo = value;
}
public void Put(State value)
{
Repo = value;
}
我有一个像这样定义的角度资源:
var stateService = angular.module('StateService', ['ngResource']);
stateService.factory('State', function ($resource) {
return $resource('http://localhost:8080/API/State');
});
当我尝试这样做时:
State.get(function (state) {
$scope.data = state.data !== undefined ? state.data : '[Not Set]';
state.data = "newvalue";
state.$save();
});
get()
工作正常,但$save()
在Chrome中引发此错误:
XMLHttpRequest cannot load http://localhost:8080/API/State. Invalid HTTP status code 405
webAPI已启用CORS(返回Access-Control-Allow-Origin: *
)。我错过了什么?
答案 0 :(得分:3)
对于某些CORS请求,浏览器会在发送资源的实际请求之前发送一个名为“预检请求”的附加请求。
飞行前请求使用HTTP OPTIONS(405状态代码)方法。它包括两个特殊标题:
即使您已启用CORS,它也适用于GET
请求,并且您已告知405 HTTP Status
请求显示POST
。这是因为,POST,PUT,DELETE
请求不是安全请求,他们首先发送请求OPTIONS
请求,您必须回复此请求,例如Access-Control-Allow-Origin: *
,Access-Control-Allow-Methods: POST
和然后它会再次发送POST
请求,然后就可以了。
请验证您要回复的标头是什么。即要成功CORS POST
请求,至少您必须与Access-Control-Allow-Methods: POST
一起发送Access-Control-Allow-Origin: *
。
启用CORS的步骤:
接下来,将[EnableCors]属性添加到Controller类:
以下参数
[EnableCors(起源:“your_domain”,标题:“*”,方法:“POST”)]
重新部署您的WebAPI项目。
消息来源 - http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api
更多链接 - http://www.codeproject.com/Articles/742532/Using-Web-API-Individual-User-Account-plus-CORS-En
答案 1 :(得分:0)
在Web.config上,在
处注释<remove name="OPTIONSVerbHandler" />
行
<system.webServer>
<handlers>
如果您使用的是web.config文件的CORS配置。