(CORS 错误)无法使用 Angular 向 ASP.net REST 服务发送 POST 请求(OPTIONS 被拒绝)
(CORS error) Can't send POST request (OPTIONS gets denied) with Angular to ASP.net REST services
所以,当我尝试发送 POST 请求时,它没有成功。 Chrome 提示我这个错误:
OPTIONS http://localhost:49475/api/Kpi/new (anonymous function) @ angular.js:10661sendReq @ angular.js:10480serverRequest @ angular.js:10187processQueue @ angular.js:14634(anonymous function) @ angular.js:14650Scope.$eval @ angular.js:15878Scope.$digest @ angular.js:15689Scope.$apply @ angular.js:15986(anonymous function) @ angular.js:23376n.event.dispatch @ jquery-2.1.4.min.js:3r.handle @ jquery-2.1.4.min.js:3
Index.html:1 XMLHttpRequest cannot load http://localhost:49475/api/MYLINK. Response for preflight has invalid HTTP status code 405
我非常怀疑我的请求有问题,但它看起来像这样:
return $http.post(apiAddress + 'mylink', dataObj)
.then(function (response) {
console.log("succeeded");
return response.status;
}, function (response) {
console.log("failed");
return response.status;
});
我已经在我的 API 部分(服务器一)上安装了 CORS,并在 WebApiConfig 中启用了它:
var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);
我还编辑了我的 Web.config 文件并启用了所有访问控制变量:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
</customHeaders>
</httpProtocol>
我的客户端在 localhost:57810 上 运行,服务器端在 localhost:49475 上。我一直在寻找这个工作近 6 个小时。我已经尝试了所有可能的片段和 "solution" 我可以在网上找到但它是不成功的。如果是...我就不会发布这个问题了...
我很感激我得到的任何答案...
编辑:Post 方法按预期工作,我已经用 Postman 对其进行了测试。现在,向提到的 url (api/mylink) 发送 OPTIONS 请求不起作用。
它returns:
{"Message":"The requested resource does not support http method 'OPTIONS'."}
好的。我可能有线索。
我猜这是路由问题:web api 找不到操作,也找不到它的选项 hadler。
Asp.Net webapi中的默认路由方法是根据请求方法决定控制器中的动作。
我倾向于不喜欢这种方法并将 WebApiConfig 文件从
routeTemplate: "api/{controller}/{id}"
到
routeTemplate: "api/{controller}/{action}/{id}"
此外,您可以将 [RoutePrefix("api/AAA")]
放在您的控制器上,将 [Route("BBB")]
放在您的操作上。此外,将 [HttpPost]
放在你的操作上,这样你就已经明确地设置了所有内容。
现在你的 url 变成了 /api/AAA/BBB
请试一试,在您的服务器域(端口)中测试它并确保您的路由按预期工作。然后继续在客户端域(端口)中进行测试。
请告诉我它是否有效
出于某种原因,WebApiConfig 和 Web.config 答案中的配置混淆了,无法协同工作。我会找更多时间来了解为什么这是一个问题,但与此同时,可行的解决方案是:
- 清除 Web.config 中
<httpprotocol>
标签之间的所有数据(我的 post 中的第 4 个片段)
- 在 WebApiConfig 中,在 EnableCorsAttribute 初始化中,发送
'*'
作为第一个参数不起作用,但显式键入:'http://localhost:57810'
起作用了!这是我原来 post. 中的第二个片段
我不知道为什么第二个会阻塞我的服务器。也许这是某种错误,因为文档清楚地表明 '*'
是通配符,或者可能是其他一些配置阻止了它的工作。
如果有人可以扩展答案,请做客。
所以,当我尝试发送 POST 请求时,它没有成功。 Chrome 提示我这个错误:
OPTIONS http://localhost:49475/api/Kpi/new (anonymous function) @ angular.js:10661sendReq @ angular.js:10480serverRequest @ angular.js:10187processQueue @ angular.js:14634(anonymous function) @ angular.js:14650Scope.$eval @ angular.js:15878Scope.$digest @ angular.js:15689Scope.$apply @ angular.js:15986(anonymous function) @ angular.js:23376n.event.dispatch @ jquery-2.1.4.min.js:3r.handle @ jquery-2.1.4.min.js:3
Index.html:1 XMLHttpRequest cannot load http://localhost:49475/api/MYLINK. Response for preflight has invalid HTTP status code 405
我非常怀疑我的请求有问题,但它看起来像这样:
return $http.post(apiAddress + 'mylink', dataObj)
.then(function (response) {
console.log("succeeded");
return response.status;
}, function (response) {
console.log("failed");
return response.status;
});
我已经在我的 API 部分(服务器一)上安装了 CORS,并在 WebApiConfig 中启用了它:
var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);
我还编辑了我的 Web.config 文件并启用了所有访问控制变量:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
</customHeaders>
</httpProtocol>
我的客户端在 localhost:57810 上 运行,服务器端在 localhost:49475 上。我一直在寻找这个工作近 6 个小时。我已经尝试了所有可能的片段和 "solution" 我可以在网上找到但它是不成功的。如果是...我就不会发布这个问题了...
我很感激我得到的任何答案...
编辑:Post 方法按预期工作,我已经用 Postman 对其进行了测试。现在,向提到的 url (api/mylink) 发送 OPTIONS 请求不起作用。
它returns:
{"Message":"The requested resource does not support http method 'OPTIONS'."}
好的。我可能有线索。
我猜这是路由问题:web api 找不到操作,也找不到它的选项 hadler。
Asp.Net webapi中的默认路由方法是根据请求方法决定控制器中的动作。 我倾向于不喜欢这种方法并将 WebApiConfig 文件从
routeTemplate: "api/{controller}/{id}"
到
routeTemplate: "api/{controller}/{action}/{id}"
此外,您可以将 [RoutePrefix("api/AAA")]
放在您的控制器上,将 [Route("BBB")]
放在您的操作上。此外,将 [HttpPost]
放在你的操作上,这样你就已经明确地设置了所有内容。
现在你的 url 变成了 /api/AAA/BBB
请试一试,在您的服务器域(端口)中测试它并确保您的路由按预期工作。然后继续在客户端域(端口)中进行测试。
请告诉我它是否有效
出于某种原因,WebApiConfig 和 Web.config 答案中的配置混淆了,无法协同工作。我会找更多时间来了解为什么这是一个问题,但与此同时,可行的解决方案是:
- 清除 Web.config 中
<httpprotocol>
标签之间的所有数据(我的 post 中的第 4 个片段) - 在 WebApiConfig 中,在 EnableCorsAttribute 初始化中,发送
'*'
作为第一个参数不起作用,但显式键入:'http://localhost:57810'
起作用了!这是我原来 post. 中的第二个片段
我不知道为什么第二个会阻塞我的服务器。也许这是某种错误,因为文档清楚地表明 '*'
是通配符,或者可能是其他一些配置阻止了它的工作。
如果有人可以扩展答案,请做客。