Ajax Post: 405 Method Not Allowed
Asked Answered
A

3

16

Within my API Controller called Payment, I have the following method:

[HttpPost]
public HttpResponseMessage Charge(Payment payment)
{
    var processedPayment = _paymentProcessor.Charge(payment);
    var response = Request.CreateResponse(processedPayment.Status != "PAID" ? HttpStatusCode.ExpectationFailed : HttpStatusCode.OK, processedPayment);
    return response;
}

In my HTML page I have:

$.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: "http://localhost:65396/api/payment/charge",
        data: $('#addPayment').serialize(),
        dataType: "json",
        success: function (data) {
            alert(data);
        }
    });

Whenever I fire the POST, I get

"NetworkError: 405 Method Not Allowed - http://localhost:65396/api/payment/charge"

What am I missing?

Thank you.

UPDATE

Here's the routing information (default)

 routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
Albertalberta answered 6/6, 2012 at 15:11 Comment(0)
A
11

Turns out I needed to implement CORS support. http://blogs.msdn.com/b/carlosfigueira/archive/2012/02/20/implementing-cors-support-in-asp-net-web-apis.aspx

Albertalberta answered 11/6, 2012 at 13:10 Comment(1)
This article seems to be more up to date... stevefenton.co.uk/Content/Blog/Date/201211/Blog/…Batchelor
H
11

Most likely your routing is not configured for the action to be invoked. Hence the request ends up in nowhere and ASP.NET Web API sends a blank-out message "method not allowed".

Can you please update the question with your routing?


UPDATE

As I thought! You are sending to http://localhost:65396/api/payment/charge while you need to send to http://localhost:65396/api/payment - assuming your controller is called PaymentController.

Note that route does not have action.

Hundredth answered 6/6, 2012 at 15:29 Comment(4)
I'm just using the default routes. I've updated the question.Albertalberta
How do I make it invoke the Charge method then? I'm going to have other POST methods within this API controller.Albertalberta
With RC you might not be able to. In beta you could add action to the route but I heard on twitter (not tried myself) that it cannot be done now. Give it a try with action in the route see if it works.Hundredth
Turns out I needed to implement CORS support. I used this link as a guide. blogs.msdn.com/b/carlosfigueira/archive/2012/02/20/…Albertalberta
A
11

Turns out I needed to implement CORS support. http://blogs.msdn.com/b/carlosfigueira/archive/2012/02/20/implementing-cors-support-in-asp-net-web-apis.aspx

Albertalberta answered 11/6, 2012 at 13:10 Comment(1)
This article seems to be more up to date... stevefenton.co.uk/Content/Blog/Date/201211/Blog/…Batchelor
P
1

I had the same problem with my controller. The only thing which is different is the ending of the URL. Add "/" to "http://localhost:65396/api/payment/charge" at the end, that helped me

Psilomelane answered 9/6, 2015 at 13:31 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.