La requête POST jQuery .ajax () renvoie 405 (méthode non autorisée) sur WCF RESTful

J’envoie une demande de publication à une application de service RESTFUL WCF. Je peux envoyer avec succès une demande POST par le biais de Fiddler.

Toutefois, lorsque je le fais par le biais de la méthode jQuery Ajax, la fonction renvoie les éléments suivants à la console pour développeur Chrome:

 OPTIONS http://www.example.com/testservice/service1.svc/GetData 405 (Method Not Allowed) jquery.min.js:6 

Mais ensuite une seconde après les logs:

 Object {d: "You entered 10"} testpost.html:16 

Cela me dit que jQuery envoie une demande OPTIONS , qui échoue, puis une demande POST qui renvoie les données attendues.

Mon code jQuery:

 $.ajax() { type: "POST", //GET or POST or PUT or DELETE verb url: "http://www.example.com/testservice/service1.svc/GetData", // Location of the service data: '{"value":"10"}', //Data sent to server contentType:"application/json", dataType: "json", //Expected data format from server processdata: false, success: function (msg) {//On Successfull service call console.log(msg); }, error: function (xhr) { console.log(xhr.responseText); } // When Service call fails }); 

J’utilise jQuery version 2.0.2.

Toute aide sur la raison de cette erreur serait une aide précieuse.

Votre code tente en réalité de faire une demande inter-domaines (CORS) , pas un POST ordinaire.

C’est-à-dire que les navigateurs modernes n’autoriseront que les appels Ajax aux services du même domaine que la page HTML.

Exemple: une page de http://www.example.com/myPage.html ne peut demander directement que des services situés sur http://www.example.com , tels que http://www.example.com/testservice/etc . Si le service est dans un autre domaine, le navigateur ne passe pas l’appel direct (comme vous le souhaitez). Au lieu de cela, il essaiera de faire une demande CORS.

En bref, pour effectuer une demande CORS, votre navigateur:

  • Va d’abord envoyer une demande OPTION à l’URL cible
  • Et alors seulement si la réponse du serveur à cette OPTION contient les en- têtes adéquats ( Access-Control-Allow-Origin est un) pour autoriser la demande CORS, la recherche effectuera l’appel (presque exactement de la même manière que si la page HTML était au même domaine).
    • Si les en-têtes attendus ne viennent pas, le navigateur abandonne simplement (comme il vous l’a fait).

Comment le résoudre? Le moyen le plus simple consiste à activer CORS (activer les en-têtes nécessaires) sur le serveur.

Si vous ne disposez pas d’un access côté serveur, vous pouvez mettre en miroir le service Web depuis un autre site, puis y activer le CORS.

Vous devez append ce code dans global.aspx :

  protected void Application_BeginRequest(object sender, EventArgs e) { HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); if (HttpContext.Current.Request.HttpMethod == "OPTIONS") { HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); HttpContext.Current.Response.End(); } } 

Vous pouvez également créer les en-têtes requirejs dans un filtre.

 @WebFilter(urlPatterns="/rest/*") public class AllowAccessFilter implements Filter { @Override public void doFilter(ServletRequest sRequest, ServletResponse sResponse, FilterChain chain) throws IOException, ServletException { System.out.println("in AllowAccessFilter.doFilter"); HttpServletRequest request = (HttpServletRequest)sRequest; HttpServletResponse response = (HttpServletResponse)sResponse; response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT"); response.setHeader("Access-Control-Allow-Headers", "Content-Type"); chain.doFilter(request, response); } ... }