我注意到关于该主题还有很多类似的问题。

调用以下任何方法时,都会出现此错误。



但是,我无法解决解决此问题的最佳做法。
到目前为止,我还没有设置任何特定的路由中间件。

// api/menus/{menuId}/menuitems
[HttpGet("{menuId}/menuitems")]
public IActionResult GetAllMenuItemsByMenuId(int menuId)
{
    ....
}

// api/menus/{menuId}/menuitems?userId={userId}
[HttpGet("{menuId}/menuitems")]
public IActionResult GetMenuItemsByMenuAndUser(int menuId, int userId)
{
    ...
}

最佳答案

您试图做的事情是不可能的,因为这些 Action 是动态激活的。在框架知道 Action 签名之前,无法绑定(bind)请求数据(例如查询字符串)。只有遵循路线,它才能知道 Action 签名。因此,您不能使路由依赖于框架甚至还不知道的事情。
总而言之,您需要以某种方式区分路由:使用其他静态路径或使userId成为路由参数。但是,您实际上不需要在这里执行单独的操作。默认情况下,所有操作参数都是可选的。因此,您可以拥有:

[HttpGet("{menuId}/menuitems")]
public IActionResult GetMenuItemsByMenu(int menuId, int userId)
然后,您可以跳转到是否为userId == 0(默认值)。在这里应该没问题,因为永远不会有ID为0的用户,但是您也可以考虑使参数可为空,然后分支到userId.HasValue上,这更加明确。
如果愿意,还可以通过使用私有(private)方法继续将逻辑分开。例如:
[HttpGet("{menuId}/menuitems")]
public IActionResult GetMenuItems(int menuId, int userId) =>
    userId == 0 ? GetMenuItemsByMenuId(menuId) : GetMenuItemsByUserId(menuId, userId);

private IActionResult GetMenuItemsByMenuId(int menuId)
{
    ...
}

private IActionResult GetMenuItemsByUserId(int menuId, int userId)
{
    ...
}

关于c# - 如何解决请求与.Net Core Web Api中的多个终结点匹配的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59283210/

10-17 01:45