无法让 CORS 与 Web API 2 一起使用

Posted

技术标签:

【中文标题】无法让 CORS 与 Web API 2 一起使用【英文标题】:Trouble getting CORS working with Web API 2 【发布时间】:2016-01-06 06:12:22 【问题描述】:

让 Cors 使用 Web Api 让我很开心。我刚刚使用 Visual Studio 2015 附带的默认模板创建了 Web Api。我所做的唯一更改是:

Install-Package Microsoft.aspnet.webapi.cors  

在 WebApiConfig.cs::Register(HttpConfiguration 配置):

   var cors = new EnableCorsAttribute(
            origins: "*",
            headers: "*",
            methods: "*");
   config.EnableCors(cors);  

我在值控制器异步中创建了POST 方法:

public async Task Post(Guid id)

我在 post 方法中添加了少量逻辑。

我正在从我的解决方案中的另一个项目调用 Web Api:

using (var client = new HttpClient())

      client.DefaultRequestHeaders.Add("My-GUID",streamProvider.Guid.ToString());
      var response = await client.PostAsXmlAsync("http://localhost.fiddler:2010/api/values", myXmlString);

      if (response.StatusCode != HttpStatusCode.Created)
      
            throw new HttpResponseException(HttpStatusCode.InternalServerError);
      
 

请求:

POST http://localhost:2010/api/values HTTP/1.1
TRS-GUID: 2ca71b41-9e78-4216-a013-e45c6fd6cb4c
Content-Type: application/xml; charset=utf-8
Host: localhost:2010
Content-Length: 183
Expect: 100-continue
Connection: Keep-Alive

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;root&gt;
  &lt;MbrId&gt;22&lt;/MbrId&gt;
&lt;/root&gt;</string>

回复:

HTTP/1.1 405 Method Not Allowed
Cache-Control: no-cache
Pragma: no-cache
Allow: GET
Content-Type: application/xml; charset=utf-8
Expires: -1
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?Qzpcc291cmNlXEFzeW5jRmlsZVVwbG9hZERlbW9cc3JjXEFwcFxhcGlcdmFsdWVz?=
X-Powered-By: ASP.NET
Date: Thu, 08 Oct 2015 14:33:08 GMT
Content-Length: 93

<Error><Message>The requested resource does not support http method 'POST'.</Message></Error>

就像我说的,我做了最小的改变,并通过 IIS express 在本地运行它。我一直在谷歌搜索并尝试了一些东西,但似乎没有任何效果。我尝试将 cors 选项添加为属性,但结果相同。我还看到一篇帖子暗示 '*' 不在原始规范中,所以我尝试使用特定的方法(POST、PUT、GET),但这也不起作用。

编辑: 这与“预检”请求有什么关系吗?我只注意到提琴手中的 POST 请求。我没有看到它发送“选项”请求。如果这是问题,httpclient 不应该自动处理吗?

回答 感谢达雷尔的回答。正如您所看到的,返回的错误消息确实具有误导性,听起来绝对像是 CORS 问题,但事实并非如此。我从未意识到 CORS 仅适用于浏览器。就像达雷尔所说的那样,这是一个路由问题。我将 Guid 作为 POST 参数放置,导致没有匹配的路由。糟糕的是,返回的错误消息再有用不过了。

【问题讨论】:

【参考方案1】:

HttpClient 没有跨域限制。它纯粹是一个网络浏览器约束。您不需要为 HttpClient 请求实现 CORS。

尝试通过 fiddler 发出 POST 请求,看看是否可行。我怀疑你可能只是有路由问题。

【讨论】:

以上是关于无法让 CORS 与 Web API 2 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

无法让 CORS 与内容类型一起使用 - Django Rest Framework

无法让 ASP.NET Core Web API 与 IIS 一起使用 [关闭]

将 Fetch 与授权标头和 CORS 一起使用

是否有特定的 asp.net 核心配置让 CORS 与多个 API 一起工作

如何在 ASP.NET Web API SelfHost 应用程序中使用 CORS?

带有 CORS 和 IE9 的 ASP Web API POST 请求(XDomainRequest 对象)