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 } ```