Dans la méthode $ http.post j'obtiens un problème 405. Nous utilisons un service unique (REST) pour les deux méthodes POST & GET.
si url ayant localhost cela fonctionne. urlAddScenario est localhost/Service.svc/api/scénarios/add. Si j'utilise le nom de la machine au lieu de locahost, cela ne fonctionne pas. machinname/Service.svc/api/scenarii/add
Mon code JS est
scenarioExecutionFactory.addScenario = function (scenarioId) {
return $http.post(urlAddScenario, scenarioId)
};
autreJS:
var runScenarioId = { "ScenarioId": 10 }
scenarioExecutionFactory.addScenario(runScenarioId )
.success(function (data) {
$scope.getScenarioRecentRuns($scope.CurrentScenario);
});
Service WCF:
[OperationContract]
[WebInvoke(UriTemplate = "api/scenarios/add",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
Method = "POST")]
Request AddScenario(ScenarioRequestParams requestParams);
config:
<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>
Je vois des OPTIONS au lieu de POST dans les en-têtes.
En-têtes:
**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
Erreur:
IE: SCRIPT7002: XMLHttpRequest: erreur réseau 0x80070005, l'accès est refusé.
Chrome: XMLHttpRequest ne peut pas charger htp // nom_ordinateur/services.svc/api/scénarios/add. Code d'état HTTP non valide 405
En-têtes de réponse: HTTP/1.1 405, méthode non autorisée
Pour activer correctement CORS
via web.config
, vous devez spécifier ces 3 en-têtes personnalisés.
<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>
Si vous envisagez de prendre en charge les verbes PUT
et DELETE
, vous devez également gérer le preflight check. Vous pouvez en savoir plus sur CORS
et contrôle en amont dans cette réponse: https://stackoverflow.com/a/27374066/4304188
Solution:
$http({
url: "",
method: "POST",
data: $.param({
data1: ""
}),
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
});
Je faisais également face à ce problème. Obtenait 405 et OPTIONS a été faite. Je suis tombé sur un blog et j'ai constaté que le serveur Web ne comprenait pas correctement la façon dont l'encodage angulaire codait. Donc, jQuery est nécessaire pour encoder les données POST
Erreur de ma part, je devais simplement remove method="post" action=""
Mauvais: <form ng-submit="doSubmit()" name="myform" method="post" action="" role="form">
Bon: <form ng-submit="doSubmit()" name="myform" role="form">