使 CORS 与 Web 一起工作时遇到问题 API 2
Trouble getting CORS working with Web API 2
让 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/"><?xml version="1.0" encoding="utf-8"?>
<root>
<MbrId>22</MbrId>
</root></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 暗示“*”不在原始规范中,所以我尝试使用特定方法(POST、PUT、GET),但这也没有用。
编辑:
这与 'preflight' 请求有什么关系吗?我只注意到提琴手中的 POST 请求。我没有看到它发送 'options' 请求。如果这是问题,httpclient 不应该自动处理吗?
回答
感谢 Darrel 的回答。如您所知,返回的错误消息确实具有误导性,听起来绝对像是 CORS 问题,但事实并非如此。我从来没有意识到 CORS 只适用于浏览器。就像 Darrell 所说的那样,这是一个路由问题。我将 Guid 作为 POST 参数,导致没有匹配的路由。糟糕的是,返回的错误消息再有用不过了。
HttpClient 没有跨域限制。它纯粹是网络浏览器的约束。您不需要为 HttpClient 请求实施 CORS。
尝试通过 fiddler 发出 POST 请求,看看是否可行。我怀疑您可能只是遇到了路由问题。
让 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/"><?xml version="1.0" encoding="utf-8"?>
<root>
<MbrId>22</MbrId>
</root></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 暗示“*”不在原始规范中,所以我尝试使用特定方法(POST、PUT、GET),但这也没有用。
编辑:
这与 'preflight' 请求有什么关系吗?我只注意到提琴手中的 POST 请求。我没有看到它发送 'options' 请求。如果这是问题,httpclient 不应该自动处理吗?
回答
感谢 Darrel 的回答。如您所知,返回的错误消息确实具有误导性,听起来绝对像是 CORS 问题,但事实并非如此。我从来没有意识到 CORS 只适用于浏览器。就像 Darrell 所说的那样,这是一个路由问题。我将 Guid 作为 POST 参数,导致没有匹配的路由。糟糕的是,返回的错误消息再有用不过了。
HttpClient 没有跨域限制。它纯粹是网络浏览器的约束。您不需要为 HttpClient 请求实施 CORS。
尝试通过 fiddler 发出 POST 请求,看看是否可行。我怀疑您可能只是遇到了路由问题。