在$ http.post方法中,我遇到了405问题。我们正在使用单一服务(REST)用于POST和& GET方法。
如果url有localhost它正在工作。 urlAddScenario是localhost / Service.svc / api / scenarios / add。如果我使用机器名而不是locahost它不起作用。 machinname / Service.svc / api / scenarios / add
我的JS代码是
scenarioExecutionFactory.addScenario = function (scenarioId) {
return $http.post(urlAddScenario, scenarioId)
};
anotherJS:
var runScenarioId = { "ScenarioId": 10 }
scenarioExecutionFactory.addScenario(runScenarioId )
.success(function (data) {
$scope.getScenarioRecentRuns($scope.CurrentScenario);
});
WCF服务:
[OperationContract]
[WebInvoke(UriTemplate = "api/scenarios/add",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
Method = "POST")]
Request AddScenario(ScenarioRequestParams requestParams);
配置:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Credentials" value="true" />
<add name="Access-Control-Allow-Methods" value="GET,POST,PUT,OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Origin,Content-Type,Accept,Authorization,X-Ellucian-Media-Type" />
</customHeaders>
</httpProtocol>
我在Headers中看到OPTIONS而不是POST。
接头:
**OPTIONS** http://ddd/HelloService/HelloService.svc/PostData HTTP/1.1
Accept: */*
Origin: http://localhost:31284
Access-Control-Request-Method: POST
Access-Control-Request-Headers: accept, content-type
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko
Host: vijayakatta
Content-Length: 0
DNT: 1
Connection: Keep-Alive
Pragma: no-cache
错误:
IE:SCRIPT7002:XMLHttpRequest:网络错误0x80070005,访问被拒绝。
Chrome:XMLHttpRequest无法加载htp // machinename / services.svc / api / scenarios / add。无效的HTTP状态代码405
响应标头:HTTP / 1.1 405方法不允许
答案 0 :(得分:6)
要通过CORS
正确启用web.config
,您需要指定这3个自定义标题
<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>
如果您打算支持PUT
和DELETE
动词,则还需要处理预检检查。
您可以在此答案中详细了解CORS
和预检检查:https://stackoverflow.com/a/27374066/4304188
答案 1 :(得分:1)
解决方案:
$http({
url: "",
method: "POST",
data: $.param({
data1: ""
}),
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
});
我也面临这个问题。获得了405和OPTIONS。我遇到了一个博客,发现网络服务器无法正确理解角度编码参数的方式。因此,jQuery需要对POST数据进行编码
答案 2 :(得分:0)
我的错误,我只需要删除 method="post" action=""
为:
<form ng-submit="doSubmit()" name="myform" method="post" action="" role="form">
○:
<form ng-submit="doSubmit()" name="myform" role="form">