让CORS与Web API 2一起工作时遇到麻烦

本文关键字:工作 遇到 麻烦 一起 CORS Web API | 更新日期: 2023-09-27 18:16:36

我花了很多时间让Cors与Web Api一起工作。我刚刚用visual studio 2015自带的默认模板创建了Web Api。我所做的唯一更改是:

Install-Package Microsoft.aspnet.webapi.cors  

在WebApiConfig.cs::Register(HttpConfiguration config):

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

我使POST方法在值控制器async:

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),但也不起作用。

编辑:


这和"飞行前"请求有关系吗?我只注意到fiddler中的POST请求。我不认为它会发送一个"选项"请求。如果这是问题,httpclient不应该自动处理这个?


感谢达雷尔的回答。正如你们所知,返回的错误信息非常误导,听起来绝对像CORS问题,但它不是。我从来没有意识到CORS只适用于浏览器。就像达雷尔说的是路线问题。我把Guid作为POST参数,导致没有路由匹配。防止错误消息返回是非常有用的。

让CORS与Web API 2一起工作时遇到麻烦

HttpClient没有跨域限制。这纯粹是web浏览器的限制。您不需要为HttpClient请求实现CORS。

尝试通过fiddler发出POST请求,看看是否有效。