Api controller declaring more than one Get statement

asp.net-mvc-4, asp.net-routing, asp.net-web-api, c#

Solution

This is all in the routing. The default Web API route looks like this:

config.Routes.MapHttpRoute( 
    name: "API Default", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
);

With the default routing template, Web API uses the HTTP method to select the action. In result it will map a GET request with no parameters to first `GetAll` it can find. To work around this you need to define a route where the action name is included:

config.Routes.MapHttpRoute( 
   name: "ActionApi", 
   routeTemplate: "api/{controller}/{action}/{id}", 
   defaults: new { id = RouteParameter.Optional } 
);

After that you can star making requests with following URL's:

- api/yourapicontroller/GetClients

- api/yourapicontroller/GetStaffMembers

This way you can have multiple `GetAll` in Controller.

One more important thing here is that with this style of routing, you must use attributes to specify the allowed HTTP methods (like [HttpGet]).

There is also an option of mixing the default Web API verb based routing with traditional approach, it is very well described here:

- Web API: Mixing Traditional & Verb-Based Routing

Problem

Using the new Api Controller in MVC4, and I've found a problem. If I have the following methods: `public IEnumberable<string> GetAll()` `public IEnumberable<string> GetSpecific(int i)` This will work. However, if I want to retrieve some different data of a different type, it defaults to the `GetAll` method, even though the `$.getJSON` is set to the `GetAllIntegers` method: `public IEnumberable<int> GetAllIntergers()` (bad naming conventions) Is it possible for me to be able to do this? Can I only have a single `GetAll` method in the Web API controller? I think it's easier to visualise what I'm trying to achieve. Here is a snippet of code to show what I'd like to be able to do, in a single `ApiController`: ``` public IEnumerable<string> GetClients() { // Get data } public IEnumerable<string> GetClient(int id) { // Get data } public IEnumerable<string> GetStaffMember(int id) { // Get data } public IEnumerable<string> GetStaffMembers() { // Get data } ```

Original source