在最新的beta 2版本中,我遇到了跨域POST请求命中Api控制器的问题。
Chrome(和其他浏览器)吐出:
OPTIONS http://api.hybridwebapp.com/api/values 400 (Bad Request)
POST http://api.hybridwebapp.com/api/values 404 (Not Found)
它可能与this issue有关,但我已应用该解决方法和其他一些修补程序,例如web.config additions here
我一直在用这个问题敲打一下,所以我创建了一个解决方案来完全重现问题。
加载网络应用程序将有2个按钮,一个用于GET一个用于POST,响应将出现在按钮旁边。 GET有效。无法让POST成功返回。
我能够从Fiddler那里得到一个提示,但这没有任何意义,因为如果你看一下它的反应就包含了Access-Controll-Allow-Origin标题中的域名:
解决方案中有一个名为“ConfigurationScreenshots”的文件夹,其中包含一些IIS配置(网站绑定)和项目属性配置的屏幕截图,以便尽可能轻松地帮助我:)
编辑:不要忘记将此条目添加到主机文件(%SystemRoot%\ system32 \ drivers \ etc):
127.0.0.1 hybridwebapp.com api.hybridwebapp.com
**状态:**似乎Chrome之类的某些浏览器允许我继续POST,无论OPTIONS响应中的错误消息如何(而其他类似Firefox则不然)。但我不认为这解决了。
查看它有的OPTIONS请求的Fidler截图
Access-Control-Allow-Origin:http://hybridwebapp.com
然而错误:
这完全是矛盾的,好像它忽略了标题。
答案 0 :(得分:23)
好的,我已经过了这个。这一直是我遇到过的最奇怪的问题。以下是如何“解决”它:
删除它:
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
<add name="Access-Control-Allow-Origin" value="http://mydomain.com" />
<add name="Access-Control-Allow-Headers" value="Accept, Content-Type, Origin" />
<add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
因为你已经有了这个:
var enableCorsAttribute = new EnableCorsAttribute("http://mydomain.com",
"Origin, Content-Type, Accept",
"GET, PUT, POST, DELETE, OPTIONS");
config.EnableCors(enableCorsAttribute);
道德:你只需要一个。
答案 1 :(得分:12)
如果您使用OAuth授权。请求不要直接访问web api。您需要为该端点启用OWIN CORS支持。
我在网站上的表现如何: 安装owin cors
Install-Package Microsoft.Owin.Cors
注意:请勿使用:Install-Package Microsoft.AspNet.WebApi.Cors
在文件Startup.Auth.cs
中 //add this line
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
// Enable the application to use bearer tokens to authenticate users
app.UseOAuthBearerTokens(OAuthOptions);
答案 2 :(得分:2)
我有一个MVC控制器(不是ApiController),但我想出的解决方案可以帮助其他人。为了允许对控制器上的POST操作(/data/xlsx
)进行跨域访问,我实现了2个操作:
如果您没有HttpOptions操作,那么您将在飞行前检查中获得404。
代码:
[HttpOptions]
public ActionResult Xlsx()
{
// Catches and authorises pre-flight requests for /data/xlsx from remote domains
Response.AddHeader("Access-Control-Allow-Origin", "*");
Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
Response.AddHeader("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE, OPTIONS");
return null;
}
[HttpPost]
public ActionResult Xlsx(string data, string name)
{
Xlsx(); // Add CORS headers
/* ... implementation here ... */
}
我已在IE 11,Chrome,FireFox中测试过它。
答案 3 :(得分:2)
将此添加到ConfigureOAuth
中的startup.cs文件中app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
答案 4 :(得分:0)
尝试在Response标头中添加以下代码:
Response.AddHeader("Access-Control-Allow-Origin", "*");