(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 答案中的配置混淆了,无法协同工作。我会找更多时间来了解为什么这是一个问题,但与此同时,可行的解决方案是:

  1. 清除 Web.config 中 <httpprotocol> 标签之间的所有数据(我的 post 中的第 4 个片段)
  2. 在 WebApiConfig 中,在 EnableCorsAttribute 初始化中,发送 '*' 作为第一个参数不起作用,但显式键入:'http://localhost:57810' 起作用了!这是我原来 post.
  3. 中的第二个片段

我不知道为什么第二个会阻塞我的服务器。也许这是某种错误,因为文档清楚地表明 '*' 是通配符,或者可能是其他一些配置阻止了它的工作。

如果有人可以扩展答案,请做客。