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

问题描述:

我正在使用visual studio 2015编写服务器和客户端。 Chrome和FireFox中出现以下问题,但在资源管理器中工作正常。 我做使用AJAX一个休息后调用我的服务器,Ajax代码:针对预检的响应具有无效的HTTP状态代码400 - aspx

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) 

而且我在在Web.config文件的WebAPI有这些配置。

<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> 

我注意到,如果我从Ajax请求我将努力删除

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

,但在我的服务器我不会得到的数据。

我不知道该怎么做,试过了一切。

+0

可能你只是尝试使用类型'object',而不是'dynamic'? – Developer

+0

@开发人员这不是解决我的问题,为什么需要这种改变? –

+0

只是想检查这是绑定到JSON到动态对象时是否是模型绑定相关的问题。通常'contentType:“application/json”'(我从来没有给出字符集)应该正确绑定到对象/类 – Developer

解决的办法是添加以下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(); 
    } 
}