12
votes

Below is WebAPI action. On googling about the below error:-

The requested resource does not support http method 'POST'

I got number of links & updated my api accordingly but still I am getting the same error.

But still when calling the above via post man throws the error.

Error

How do I get rid of this error??

Also is it possible to fix this without using [FromBody] attribute in the method parameters list?

Any help/suggestion highly appreciated. Thanks.

2
propably, There is another action called "rename". and [Route("rename/{userId}/{type}/{title}/")] does not match your request url.levent
@levent, checked. nothing suchKgn-web

2 Answers

7
votes

You have declared route which requires url parameters

[Route("rename/{userId}/{type}/{title}/")]

So when you send request to api/customer/rename it does not match this method. You should remove parameters which you are passing in request body from route parameters

[Route("rename")]

Make sure that you have appropriate RoutePrefix("api/customer") attribute on your controller.


Second problem is multiple [FromBody] parameters. You will get can't bind multiple parameters error. There is limitation - you can mark only one parameter as FromBody. See Sending Simple Types notes:

Web API reads the request body at most once, so only one parameter of an action can come from the request body. If you need to get multiple values from the request body, define a complex type.

You should create complex type which will hold all parameters

public class RenameModel
{
   public int UserId { get; set; }
   public string Type { get; set; }
   public string Title { get; set; }
}

And change method signature to

[HttpPost]
[Route("rename")]
public IHttpActionResult Rename(RenameModel model)

And send request data as application/x-www-form-urlencoded

2
votes
 [Route("rename/{userId}/{type}/{title}/")]
 public IHttpActionResult Rename([FromBody] int userId,  [FromBody] string  type, [FromBody] string title)

The last answer is correct, you're asking for these parameters in the route, but saying that you expect them in the post body. Also, usually the route would begin with a noun rather than a verb. What is it you're renaming? (i.e. [Route("users/rename/{userId}/{type}/{title}")]

Based on your initial post, try this instead:

 [HttpPost]
 [Route("rename/{userId}/{type}/{title}" Name = "RenameUser"]
 public IHttpActionResult Rename(int userId, string type, string title)
 {
     _myServiceMethod.Rename(userId, type, title);
     return new StatusCodeResult(HttpStatusCode.Created, this);   
 }

Or, if you wanted to do a post with the info in the body: Declare your data contract:

public class User
{
    public string Type { get; set; }
    public string Title { get; set; }
}

Then on the endpoint:

[HttpPost]
[Route("rename/{userId}", Name = "RenameUserPost")]
public IHttpActionResult RenameUserPost(int userId, [FromBody] User userData)
{
    return new StatusCodeResult(HttpStatusCode.Created, this);
}

Note that in both returns 'this' refers to your controller class that inherits from ApiController. Verified both of these in swagger, and they accept POSTs and return status codes.

Hope this helps.