jqueryweb-servicesrestpostwcf-rest

jQuery .ajax() POST Request throws 405 (Method Not Allowed) on RESTful WCF


I am sending a post request to a RESTFUL WCF service application. I am able to successfully send a POST request through Fiddler.

However when I do this through the jQuery Ajax method the function returns the following to the Chrome Developer Console:

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

But then a second after logs:

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

What this tells me is that jQuery is sending a OPTIONS request, which fails, and then sending a POST request which returns the expected data.

My jQuery Code:

$.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             
});

I am using jQuery version 2.0.2.

Any help on why this error is occurring would be a great help.


Solution

  • Your code is actually attempting to make a Cross-domain (CORS) request, not an ordinary POST.

    That is: Modern browsers will only allow Ajax calls to services in the same domain as the HTML page.

    Example: A page in http://www.example.com/myPage.html can only directly request services that are in http://www.example.com, like http://www.example.com/testservice/etc. If the service is in other domain, the browser won't make the direct call (as you'd expect). Instead, it will try to make a CORS request.

    To put it shortly, to perform a CORS request, your browser:

    How to solve it? The simplest way is to enable CORS (enable the necessary headers) on the server.

    If you don't have server-side access to it, you can mirror the web service from somewhere else, and then enable CORS there.