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

标签 javascript angularjs wcf rest

我在 StackOverflow 中阅读过许多类似的问题,但这些解决方案对我不起作用。

我有 WCF REST 服务:

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

我可以使用 Postman(Chrome 扩展)来使用它。我将数据作为“原始”而不是“urlencoded”传递。我得到 200 返回码。

enter image description here

我需要使用 angularjs 调用这个方法:

    $http.post('http://192.168.1.65/Service1.svc/restapi/PostItem',                   
                {
    "Address": "г. Москва, ул. Соколово-Мещерская, д.25",
     ...
    "User": ""
      })  

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

angular.js:10722 OPTIONS http://192.168.1.65/Service1.svc/restapi/PostItem http://192.168.1.65/Service1.svc/restapi/PostItem. Response for preflight has invalid HTTP status code 405

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

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

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

这对我没有帮助。而且我不确定服务器端错误的原因。 Postman扩展可以成功调用该方法。

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

更新:

这是 OPTIONS 请求:

enter image description here

评论和回复选项卡是空的

更新 2:

在 IE 中一切正常,但在 Chrome 中不起作用。

最佳答案

我想展示什么对我有用。

首先,您必须在 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>

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

<add name="Access-Control-Allow-Headers" value="Content-Type, X-Your-Extra-Header-Key" />

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

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

关于javascript - 预检响应具有无效的 HTTP 状态代码 405,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33514687/

相关文章:

javascript - ng-cloak 是如何工作的?

javascript - Laravel 字符串本地化和 AngularJS

winforms - 在应用程序中打开太多线程是否不好?

javascript - Breeze.js - 尝试使用 "any"运算符时出错 - 错误 : Unable to get value of the property 'isAnonymous' : object is null or undefined

php - 我想要一个分页到我的 wordpress 插件选项页面?

javascript - 如何获取下拉值变化的下拉数据?

angularjs - 状态更改时 ui-router 获取 Http 状态代码

c# - 从 jquery/javascript 调用 Windows 服务 wcf 服务

c# - 在第一次尝试使用 WCF 失败后,客户端如何尝试重新连接到服务器?

javascript - 在javascript中反转十进制数字