我在 StackOverflow 中阅读过许多类似的问题,但这些解决方案对我不起作用。
我有 WCF REST 服务:
[<OperationContract>]
[<WebInvoke(UriTemplate = "PostItem",
RequestFormat= WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json, Method = "POST")>]
我可以使用 Postman(Chrome 扩展)来使用它。我将数据作为“原始”而不是“urlencoded”传递。我得到 200 返回码。
我需要使用 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
我搜索过类似的问题,找到了两个解决方案:
- 使用 jQuery 设置标题
Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
,但它不适用于我的 WCF 服务 在我的 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 请求:
评论和回复选项卡是空的
更新 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/