30
votes

Implementing Swashbuckle/Swagger with .net Core 2 API I am now receiving the 500 error when accessing swagger.json:

NotSupportedException: Ambiguous HTTP method for action - EBisAPI.Controllers._class.HandleError (EBisAPI). Actions require an explicit HttpMethod binding for Swagger

I have gone through all the controllers and see explicit routing on all the public methods of each controller. Is there a way to determine which method is throwing the ambiguous routing error?

7

7 Answers

65
votes

This can occur when a method is declared public in a controller, but without REST attributes. Changing the method to protected may address the issue.

I have seen this error before and usually the errormessage points to the culprit: EBisAPI.Controllers._class.HandleError

I guess HandleError is a public method in your base class, right? Change it to protected and try again.

17
votes

The Clean way could be using data annotation [NonAction] instead to set your method as protected.

17
votes
15
votes

I solved this error by decorating the method mentioned in the error with the correct HTTP attribute. For exemple: [HttpGet]

This code throws error:

public object Get()
{
    MongoDbContext dbContext = new MongoDbContext();
    return new {
        API = true,
        Database = dbContext.Status()
    };
}

This code works:

[HttpGet]
public object Get()
{
    MongoDbContext dbContext = new MongoDbContext();
    return new {
        API = true,
        Database = dbContext.Status()
    };
}
5
votes

As i mentioned at "Swashbuckle not creating swagger.json file" :

  1. Decorate all actions with explicit Http Methods like[HttpGet("xxx")],[HttpPost("xxx")] or ... instead of [Route("xxx")].
  2. Decorate public methods in controllers with [NoAction] Attribute.
0
votes

I Had the same problem, and was because i have done the override of the Ok() method ,returning an OkObjectResult. The solution was change it from public to protected

0
votes

I tried different solutions but what it worked for me was adding the route inside the attributes as stated above. I.E: [HttpPost("yourRoute/create")] one of the issues was that I have 2 get methods so I changed their names and added the route to the attributes as I said.