J’ai un simple service ASP.Net WebAPI qui assigne une variable statique sur POST / PUT et renvoie la valeur sur GET:
private static State Repo = null; public State Get() { return Repo; } public void Post(State value) { Repo = value; } public void Put(State value) { Repo = value; }
Et j’ai une ressource angular définie comme suit:
var stateService = angular.module('StateService', ['ngResource']); stateService.factory('State', function ($resource) { return $resource('http://localhost:8080/API/State'); });
Quand j’essaie de faire ceci:
State.get(function (state) { $scope.data = state.data !== undefined ? state.data : '[Not Set]'; state.data = "newvalue"; state.$save(); });
Le get()
fonctionne bien, mais le $save()
lève cette erreur en chrome:
XMLHttpRequest cannot load http://localhost:8080/API/State. Invalid HTTP status code 405
CORS est déjà activé sur WebAPI (renvoie Access-Control-Allow-Origin: *
). Qu’est-ce que je rate?
Pour certaines demandes CORS, le navigateur envoie une demande supplémentaire, appelée “demande de contrôle en amont”, avant d’envoyer la demande réelle pour la ressource.
La demande préalable au vol utilise la méthode HTTP OPTIONS (code d’état 405). Il comprend deux en-têtes spéciaux:
Même si vous l’aviez activé pour CORS, il fonctionnait pour la requête GET
et vous aviez indiqué qu’il 405 HTTP Status
pour la requête POST
. En effet, les requêtes POST,PUT,DELETE
ne sont pas sécurisées, elles envoient d’abord la requête OPTIONS
requête, vous devez y répondre, ce qui nécessitera des ressources telles que Access-Control-Allow-Origin: *
, Access-Control-Allow-Methods: POST
, puis il enverra à nouveau une demande POST
, et cela fonctionnera ensuite.
Veuillez vérifier quels sont les en-têtes que vous envoyez en réponse. CORS POST
, pour que la demande CORS POST
aboutisse, vous devez au moins envoyer des Access-Control-Allow-Methods: POST
avec la commande Access-Control-Allow-Origin: *
avec la commande Access-Control-Allow-Origin: *
.
Étapes pour le rendre compatible CORS:
Ensuite, ajoutez l’atsortingbut [EnableCors] à la classe de contrôleur:
Avec les parameters suivants
[EnableCors (origins: “votre_domaine”, en-têtes: “*”, méthodes: “POST”)]
Redéployez votre projet WebAPI.
SOURCE – http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api
Plus de liens – http://www.codeproject.com/Articles/742532/Using-Web-API-Individual-User-Account-plus-CORS-En
Sur Web.config, commentez la ligne
à
Si vous utilisez la configuration CORS par le fichier web.config.