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

Calling a Web API action that has same signature as another

我有一个 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));
}

除了方法名称之外,这两个操作具有相同的签名。我怎样才能做到这一点,以便我可以调用其中之一?

谢谢...

从路由组件的角度考虑一下。如果你收到一个像 /api/users/123 这样的 URL 并且你在控制器中有上述操作,你会怎么做?

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

[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
  • /api/users/group/123

控制器级别的路由属性为所有路由设置了一个公共前缀,因此您无需为所有路由指定它。

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