在Web API中基于QueryString区分路由

时间:2014-10-15 08:25:56

标签: c# rest asp.net-web-api

我有一个ApiController,我有2个动作:

public IEnumerable<Users> GetUsers(){}

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

因为我有如下默认路由:

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

我收到错误:

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

基本上,我想在我的控制器中执行2个操作:一个返回所有用户,另一个返回用户的分页形式。就像这里:http://dev.librato.com/v1/pagination

请建议我如何实现这一目标。

1 个答案:

答案 0 :(得分:1)

默认情况下,WebApi使用约定将请求映射到特定的操作方法。使用当前设置,它无法决定应该使用哪两种方法。您可以在此处阅读有关WebApi路由的更多信息 - Routing in ASP.NET Web API

一旦解决此类问题的方法是使用属性路由。正如名称所暗示的那样,属性用于控制请求如何映射到操作方法。您可以在此处详细了解属性路由 - http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

要解决属性路由问题,可以使用以下设置:

[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") { }
}

现在,如果您向api/pagination/users发出请求,则会调用GetUsers()。同样,如果您向api/pagination/users-paginated发出请求,则会调用UsersPagination()