调用与另一个签名具有相同签名的Web API操作

时间:2017-07-06 12:56:53

标签: controller asp.net-core-mvc action asp.net-core-webapi asp.net-core-1.1

我有一个ASP .Net Core 1.1 Web Api。在我的一个控制器中,我想要两个动作:

[HttpGet("{userId:int}")]
public async Task<IActionResult> GetUser([FromRoute] int id)
{
    return Ok(_context.User.Where(u.Id == id));
}

[HttpGet("{groupId:int}")]
public async Task<IActionResult> GetUsersInGroup([FromRoute] int groupId)
{
    return Ok(_context.User.Where(u.GroupId == groupId));
}

除方法名称外,两个操作都具有相同的签名。我怎样才能做到这一点,以便我可以打电话给其中一个?

...谢谢

1 个答案:

答案 0 :(得分:1)

从路由组件的角度考虑它。如果您收到for /f "skip=7 eol=: delims=" %%F in ('dir /b /o-d /a-d *.txt') do @del "%%F" 之类的网址并且您在控制器中执行了上述操作,您会怎么做?

你必须区分它们,例如属性:

/api/users/123

现在可以通过以下方式访问它们:

  • [Route("api/users")] public class UsersController : Controller { [HttpGet("{userId:int}")] public async Task<IActionResult> GetUser([FromRoute] int userId) { return Ok(_context.User.Where(u.Id == userId)); } [HttpGet("group/{groupId:int}")] public async Task<IActionResult> GetUsersInGroup([FromRoute] int groupId) { return Ok(_context.User.Where(u.GroupId == groupId)); } }
  • /api/users/123

控制器级别Route-attribute为所有路由设置公共前缀,因此您无需为所有路由指定它。

然后HttpGet属性指定了一个额外的前缀,因此它们基本上是不同的路由。