.net 当一个控制器的路由的前缀是另一个控制器的路由时,Swagger不插入路径参数

y4ekin9u  于 2023-11-20  发布在  .NET
关注(0)|答案(1)|浏览(211)

编辑:

事实证明,Swagger(swashbuckle)必须承担责任,它没有使用正确的customerId填充URL。它应该将请求发送到像 /API/customers/1/orders 这样的东西,但它实际上将请求发送到 /API/customers/{customerid}/orders,而不是使用真实的值填充customerid
x1c 0d1x的数据

那么,如何才能让swagger将真实的值插入到url中呢?
原件

我有一个 CustomersController 和一个 OrdersControllerCustomersController 的路由是 /API/customers,它是 OrdersController/API/customers/{customerId}/orders)路由的前缀。

[Route("api/[controller]")]
[ApiController]
public class CustomersController : ControllerBase
{
    [HttpGet]
    public async Task<IActionResult> List()
    {
        return Ok();
    }
}

[Route("api/customers/{customerId:int}/[controller]")]
[ApiController]
public class OrdersController : ControllerBase
{
    [HttpGet]
    public async Task<IActionResult> ListOrders(int customerId)
    {
        return Ok();
    }
}

字符串
swagger站点(SwashBuckle)正确显示了API。但是,当我尝试使用 /api/customers/{customerid}/orders 时,它返回404我应该如何配置路由以使API工作?
我可以想到一些变通办法,将ListOrders放在 CustomersController 中。

public class CustomersController : ControllerBase
{
    [HttpGet("{customerId:int}/orders"]
    public async Task<IActionResult> ListOrders(int customerId)
    {
        return Ok();
    }
}


但这不是我真正想要的,我想让CustomersController只处理与客户相关的东西。

9bfwbjaz

9bfwbjaz1#

解决方案是将路径参数customerId更改为customerid(现在一切都是空的)。然后swagger(SwashBuckle)将正确地将路径参数设置为url。

[Route("api/customers/{customerid:int}/[controller]")]
[ApiController]
public class OrdersController : ControllerBase
{
    [HttpGet]
    public async Task<IActionResult> ListOrders(int customerid)
    {
        return Ok();
    }
}

字符串

相关问题