预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 x-ms-request-root-id

Posted

技术标签:

【中文标题】预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 x-ms-request-root-id【英文标题】:Request header field x-ms-request-root-id is not allowed by Access-Control-Allow-Headers in preflight response 【发布时间】:2017-10-10 16:37:35 【问题描述】:

我在同一个解决方案中有一个 ASP.Net Core 和一个 Web Api 项目。我从我的 Api 项目中定义的核心项目中调用 Get、Post、Put、Delete。当然我需要启用 CORS。

下面是我在我的 Web Api web.config 文件中添加的代码,

<httpProtocol>
  <customHeaders>
    <!-- Enable Cross Domain AJAX calls -->
     <clear />
          <add name="Access-Control-Allow-Origin" value="*" />
          <add name="Access-Control-Allow-Headers" value="Content-Type"/>
  </customHeaders>
</httpProtocol>

还有我来自 Core 项目的 Ajax 代码,

$.ajax(
        "url": "myApiUrl",
        "type": "Get",
        "data": 
            //Here I'm passing a value
        ,
         success: function (d) 
        

我将这两个项目都设置为启动项目。没什么大不了。它正在调用 Api 方法并返回数据。但有时它没有返回任何内容,即使该方法返回数据,我在问题标题中提到的browser console 中也遇到了错误。我在SO中查了很多答案,包括this one,都说我需要在我的response header中添加access control。任何人都告诉我我需要在哪里准确添加以及我需要添加什么才能按预期工作。

我也检查了 Asp.net MVC 项目而不是 Core,同样的事情发生了。

注意:我在我的 Web Api 项目中添加了 CORS,而不是在我的 Web 项目中。

【问题讨论】:

是否在 Web API 操作中启用了授权,即授权属性? 没有。目前,我提供的所有 Api 方法都无需身份验证 好的。您能否展示一下您是如何启用 CORS 的? 我已经在帖子中提到了,我已经在Web Api项目的Web.Config文件中添加了这两行。 【参考方案1】:

我猜你没有在 Web API 中正确启用 CORS。您可以通过以下过程做到这一点:

1) 您可以将 [EnableCors] 属性放在 Web API 中的控制器或 WebAPI Config 中的全局。

示例 - [EnableCors("*", "*", "*")]。 把它放在控制器上(你想允许 CORS)。 注意:您可以修改此过滤器的属性以允许某些方法、URL 等

2) 在 WebAPi.config 中调用 enableCors 即

public static void Register(HttpConfiguration config)
  
    // Other configuration omitted
    config.EnableCors();
  

编辑:如果您需要全局启用 CORS,请从控制器中删除 EnableCors 属性并将 WebApiConfig.cs 文件中的 EnableCors() 行修改为:

config.EnableCors(new EnableCorsAttribute("*", "*", "*"));

【讨论】:

虽然我想要全局,这就是我在 web.config 文件中添加的原因。没有任何问题。但是我需要在哪里写注册方法? 不需要写注册方法。它已经存在于 web api 项目的 WebApiConfig.cs 文件中。它默认创建。你只需要在里面添加一行。 目前我正在研究 ASP.Net Core。没有名为 WebApiConfig.cs 的文件。我在配置方法下添加了 startup.cs 文件。说,不包含 EnableCors 的定义。 对于 Asp.Net Core,这应该对您有所帮助:***.com/questions/31942037/…【参考方案2】:

试试这个:

   public void ConfigureServices(IServiceCollection services)

    services.AddCors(o => o.AddPolicy("CrossPolicy", builder =>
    
        builder.AllowAnyOrigin()
               .AllowAnyMethod()
               .AllowAnyHeader();
    ));

    // ...
 

对于每个请求:

public void Configure(IApplicationBuilder app)

    app.UseCors("CrossPolicy");

    // ...

[EnableCors("CrossPolicy")]

您可以在this 和this 链接中找到更多信息。

希望对你有所帮助。

【讨论】:

我的应用程序中没有 ApplicationOAuthProvider 类或 MatchEndpoint。我需要添加那些还是什么?如果我需要添加,那么我需要在哪里添加? 我更新了我的答案。并对我之前的回答感到抱歉。那是为 ASP.NET web api 2@BasantaMatia

以上是关于预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 x-ms-request-root-id的主要内容,如果未能解决你的问题,请参考以下文章

预检响应没有 HTTP ok 状态。 Angular 6 中的 403

OAuth 中的 CORS:对预检请求的响应未通过访问控制检查

预检响应中的 Access-Control-Allow-Headers 不允许授权

预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段内容类型

预检响应中的 Access-Control-Allow-Header 中的允许请求标头字段

预检响应中的 Access-Control-Allow-Methods 不允许方法 PATCH