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

par*_*ent 27 asp.net cors asp.net-web-api

在最新的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) 
Run Code Online (Sandbox Code Playgroud)

它可能与此问题有关,但我已应用该解决方法和其他一些其他修补程序,例如web.config 添加

我一直在用这个敲打我的脑袋一段时间,所以我创建了一个解决方案来完全重现问题.

加载Web应用程序将有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
Run Code Online (Sandbox Code Playgroud)

**状态:**似乎Chrome之类的某些浏览器允许我继续POST,无论OPTIONS响应中的错误消息如何(而其他像Firefox则没有).但我不认为这解决了.

查看它有的OPTIONS请求的Fidler截图

Access-Control-Allow-Origin:http://hybridwebapp.com

然而错误:

原产地http://hybridwebapp.com是不允许的

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

par*_*ent 23

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

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

删除这个:

    <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>
Run Code Online (Sandbox Code Playgroud)

因为你已经有了这个:

 var enableCorsAttribute = new EnableCorsAttribute("http://mydomain.com",
                                                   "Origin, Content-Type, Accept",
                                                   "GET, PUT, POST, DELETE, OPTIONS");
        config.EnableCors(enableCorsAttribute);
Run Code Online (Sandbox Code Playgroud)

道德:你只需要一个.


Gre*_*olf 12

如果您使用OAuth授权.请求不要直接访问web api.您需要为该端点启用OWIN CORS支持.

我如何在我的网站上安装:安装owin cors

Install-Package Microsoft.Owin.Cors
Run Code Online (Sandbox Code Playgroud)

注意:请不要使用: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);
Run Code Online (Sandbox Code Playgroud)

  • 问我理解,Microsoft.Owin.Cors允许所有人使用cors(webapi,mvc控制...),WebApi.Cors仅为WebApi设置. (2认同)