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

dem*_*mas 11 javascript rest wcf angularjs

我在StackOverflow中已经阅读了很多类似的问题,但这些解决方案并不适用于我.

我有WCF REST服务:

[<OperationContract>]    
    [<WebInvoke(UriTemplate = "PostItem", 
            RequestFormat= WebMessageFormat.Json,   
            ResponseFormat = WebMessageFormat.Json, Method = "POST")>]         
Run Code Online (Sandbox Code Playgroud)

我可以使用Postman(Chrome扩展程序)使用它.我将数据传递为'raw',而不是'urlencoded'.我得到200返回代码.

在此输入图像描述

我需要使用angularjs调用此方法:

    $http.post('http://192.168.1.65/Service1.svc/restapi/PostItem',                   
                {
    "Address": "?. ??????, ??. ????????-?????????, ?.25",
     ...
    "User": ""
      })  
Run Code Online (Sandbox Code Playgroud)

我刚从Postman复制了URL和JSON.但我得到错误:

angular.js:10722选项 http://192.168.1.65/Service1.svc/restapi/PostItem http://192.168.1.65/Service1.svc/restapi/PostItem.预检的响应具有无效的HTTP状态代码405

我搜索过类似的问题并找到了两个解决方案:

  1. 使用jQuery设置标头Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',但它不适用于我的WCF服务
  2. 在我的Web.Config中设置自定义标头:

    <httpProtocol>
       <customHeaders>
          <add name="Access-Control-Allow-Origin" value="*" />
          <add name="Access-Control-Allow-Headers" value="Content-Type" />
          <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
       </customHeaders>
    </httpProtocol>
    
    Run Code Online (Sandbox Code Playgroud)

它对我没有帮助.而且我不确定服务器端出错的原因.Postman扩展可以成功调用此方法.

如何使用AngularJS进行相同的POST调用?

更新:

这是OPTIONS请求:

在此输入图像描述

"审核和响应"选项卡为空

更新2:

一切都在IE中正常工作,但在Chrome中不起作用.

Tia*_*vêa 25

即使是封闭的问题,我想展示一下对我有用的东西.

首先,您必须在web.config上启用CORS(如Mihai sad):

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE,     OPTIONS" />
  </customHeaders>
</httpProtocol>
Run Code Online (Sandbox Code Playgroud)

如果您有一些额外的HEADER参数,则必须将其添加到Access-Control-Allow-Headers,例如:

<add name="Access-Control-Allow-Headers" value="Content-Type, X-Your-Extra-Header-Key" />
Run Code Online (Sandbox Code Playgroud)

最后,要处理OPTIONS请求,您必须回复空响应,在您的应用程序类中添加:

protected void Application_BeginRequest()
{
    if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
    {
        Response.Flush();
    }
}
Run Code Online (Sandbox Code Playgroud)


dem*_*mas 7

看起来我找到了解决方案.我刚刚添加了第二种方法:

[<OperationContract>]    
[<WebInvoke(UriTemplate = "PostTest", 
        RequestFormat= WebMessageFormat.Json,   
        ResponseFormat = WebMessageFormat.Json, Method = "POST")>]         
abstract PostTest: obj: Test -> unit

[<OperationContract>]    
[<WebInvoke(UriTemplate = "PostTest", 
        RequestFormat= WebMessageFormat.Json,   
        ResponseFormat = WebMessageFormat.Json, Method = "OPTIONS")>]         
abstract PostTestOptions: unit -> unit
Run Code Online (Sandbox Code Playgroud)

它只是空方法,什么都不做.我不知道原因,但一切正常.