预检响应具有无效的 HTTP 状态代码 400 - aspx

Posted

技术标签:

【中文标题】预检响应具有无效的 HTTP 状态代码 400 - aspx【英文标题】:Response for preflight has invalid HTTP status code 400 - aspx 【发布时间】:2017-05-10 18:51:22 【问题描述】:

我正在使用 Visual Studio 2015 编写服务器和客户端。 以下问题在 Chrome 和 FireFox 中出现,但在 Explorer 中完美运行。 我正在使用 AJAX 对我的服务器进行 Rest post 调用,AJAX 代码:

function CheckIntegrityExecution() 
    var request = ...
    var reqJson = JSON.stringify(request);
    $.ajax(
        type: "POST",
        url: "http://localhost:55857/api/post/flow",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        data: reqJson,
        success: function (jsonData) 
            ...
        ,
        error: function () 
            alert("error");
        
    );

最初我收到 405 错误,通过添加

解决了这个问题
    var cors = new EnableCorsAttribute("http://localhost:55857", "*", "*");
    config.EnableCors(cors);

到 Global.asax 中的注册函数:

public static void Register(HttpConfiguration config)

现在我收到以下错误:

XMLHttpRequest cannot load http://localhost:55857/api/post/flow. Response for preflight has invalid HTTP status code 400

我的服务器中的方法签名是

[Route("api/post/flow")]
public HttpResponseMessage PostCommand([FromBody] dynamic value)

我在 WebApi 的 Web.config 中有这些配置。

  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="OPTIONS, TRACE, GET, HEAD, POST, PUT" />
    <add name="Access-Control-Allow-Headers" value="Origin, Content-Type, Authorization, Accept, X-Requested-With" />
  </customHeaders>

我注意到如果我删除了

contentType: "application/json; charset=utf-8",

我会从 Ajax 请求中工作,但我不会在我的服务器中获取数据。

我不知道该怎么做,什么都试过了。

【问题讨论】:

您可以尝试使用object 类型而不是dynamic 吗? @Developer 这不能解决我的问题,为什么需要这个改变? 只是想检查这是否是模型绑定相关的问题,同时将 json 绑定到动态对象。通常contentType: "application/json"(虽然我从不提供字符集)应该正确绑定到对象/类 @Developer 这不是当前的问题。 (在我的项目中仔细检查过,仍然是同样的错误) 哎呀对不起,请阅读问题标题。似乎您的问题与 CORS 预检有关。理想情况下,您不需要在两个地方配置 CORS - 您可以在代码或配置中使用它。可能您会从提琴手输出中获得更多详细信息。 【参考方案1】:

解决方案是将以下内容添加到 Global.asax 文件中

protected void Application_BeginRequest()

    var context = HttpContext.Current;
    var response = context.Response;


    if (context.Request.HttpMethod == "OPTIONS")
    
        response.AddHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
        response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
        response.End();
    

【讨论】:

以上是关于预检响应具有无效的 HTTP 状态代码 400 - aspx的主要内容,如果未能解决你的问题,请参考以下文章

axios 和 reactjs:预检响应具有无效的 HTTP 状态代码 400

预检响应具有无效的 HTTP 状态代码 404”

预检响应具有无效的 HTTP 状态代码:401 角度

预检响应在角度 4 中具有无效的 HTTP 状态代码 500

Angular 5:预检响应具有无效的 HTTP 状态代码 403

Angular $http:预检响应具有无效的 HTTP 状态代码 403