.net core api 分层路由

.net core api hierarchical routing

我正在构建一个 api,我希望能够使用分层路由,例如:

api/category/1234/product
api/category/1234/product/5678

目前我在 ProductController: [Route("api/[controller]")] 上使用 Route 属性,这是因为我的大部分路由都遵循该约定。

我在 ProductController 上有一个方法:

[HttpGet]
[Route("/api/category/{categoryId:int}/product")]
public IActionResult GetAllByCategoryId(int categoryId)
{
    var products = _productRepo.Query(p => p.CategoryId == categoryId);

    return Ok(products);
}

万岁,returns 数据 api/category/{categoryId:int}/product

但由于控制器上的 Route 属性,它仍将 return api/product/{categoryId:int} 的数据。

我的问题是:

有没有办法覆盖控制器路由模板?

目前我能想到的唯一替代选择是在每个方法上放置一个 Route 属性。必须有更好的方法来处理分层路由。

but it will still return the data for api/product/{categoryId:int} because of the Route attribute on the controller.

这不太对。正如您在操作级别 Route 属性中指定的那样,您的 GetAllByCategoryId() 操作将只能由 /api/category/{categoryId:int}/product 访问。

如果您为 api/product/12345 发送 HTTP GET 并收到一些返回的数据,可能您在处理请求的控制器中有一些其他操作。它可能具有以下路由属性之一:

[HttpGet("{id}")]
public IActionResult Get(int id)
{
    // ...
}

[Route("{id:int}")]
public IActionResult Get(int id)
{
    // ...
}

所以只需调试您的控制器并检查实际执行的操作。我打赌不会是 GetAllByCategoryId().