我有一个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
请建议我如何实现这一目标。
答案 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()
。