lbrahim
lbrahim

Reputation: 3810

Differentiate Route Based On QueryString in Web API

I have an ApiController where I have 2 actions:

public IEnumerable<Users> GetUsers(){}

public IHttpActionResult UsersPagination(int startindex = 0, int size = 5, string sortby = "Username", string order = "DESC"){}

Since I have default routing like below:

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

I get the error:

Multiple actions were found that match the request: GetUsers on type HomeBook.API.Controllers.UsersController UsersPagination on type HomeBook.API.Controllers.UsersController

Basically, I want 2 actions in my controller: one that returns all users another returns a pagination form of users. Like here: http://dev.librato.com/v1/pagination

Please suggest how I can achieve this.

Upvotes: 0

Views: 603

Answers (1)

Milan Nankov
Milan Nankov

Reputation: 1481

By default, WebApi uses a convention to map request to specific action methods. With the current setup it cannot decide which of the two methods should be used. You can read more about WebApi routing here - Routing in ASP.NET Web API

Once way to resolve such problems is to use Attribute Routing. As the name suggest with this technique attributes are used to control how requests are mapped to action methods. You can read more about Attribute routing here - http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

To solve your problem with attribute routing you can use the following setup:

[RoutePrefix("api/pagination")]
public class MyController
{
    [HttpGet]
    [Route("users")]
    public IEnumerable<Users> GetUsers() { }

    [HttpGet]
    [Route("users-paginated")]
    public IHttpActionResult UsersPagination(int startindex = 0, int size = 5, string sortby = "Username", string order = "DESC") { }
}

Now, if you make a request to api/pagination/users then GetUsers() will be invoked. Similarly, if you make a request to api/pagination/users-paginated then UsersPagination() will be invoked.

Upvotes: 1

Related Questions