AngularJS $ http.POST方法405错误

时间:2014-12-09 19:44:05

标签: asp.net angularjs asp.net-web-api cors

在$ 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方法不允许

3 个答案:

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

如果您打算支持PUTDELETE动词,则还需要处理预检检查。 您可以在此答案中详细了解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">