CORS POST请求无效 - 选项(错误请求) - 不允许来源

时间:2013-07-18 02:16:16

标签: asp.net asp.net-web-api cors

在最新的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成功返回。

enter image description here

我能够从Fiddler那里得到一个提示,但这没有任何意义,因为如果你看一下它的反应就包含了Access-Controll-Allow-Origin标题中的域名:

enter image description here

解决方案中有一个名为“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

然而错误:

不允许来源http://hybridwebapp.com

这完全是矛盾的,好像它忽略了标题。

5 个答案:

答案 0 :(得分:23)

好的,我已经过了这个。这一直是我遇到过的最奇怪的问题。以下是如何“解决”它:

  1. 继续照常生活,直到突然没有 OPTIONS对此域的请求开始返回200 OK(而不是400 Bad Request)并且POST永远不会发生(或者至少看起来它没有因为浏览器吞下了它而不是它。)
  2. 意识到Fiddler的OPTIONS响应神秘地包含“Access-Control-Allow-XXX”的重复项。
  3. 尝试从web.config中删除以下语句,即使您清楚地记得尝试修复上一个问题并且它无法正常工作:
  4. 删除它:

        <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个操作:

  1. 进行飞行前检查
  2. 发布帖子
  3. 如果您没有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", "*");