【问题标题】:.Net Api - Parent route matched for invalid nested route.Net Api - 与无效嵌套路由匹配的父路由
【发布时间】:2021-08-13 00:58:48
【问题描述】:

我有一个 .Net 5 API 和一些嵌套路由,如下所示:

  [Route("api/v{version:apiVersion}/orders")]
  [ApiVersion("1.0")]
  [ApiController]
  public class OrdersController: ControllerBase
  {
    [HttpGet("{userId:required}")]
    public async Task<ActionResult> Get(string userId,
      CancellationToken cancellationToken = default)
    {
      // return the orders corresponding to the userId
    }
  }

  [Route("api/v{version:apiVersion}/orders/details")]
  [ApiVersion("1.0")]
  [ApiController]
  public class OrdersDetailsController: ControllerBase
  {
    [HttpGet("{orderId:required}")]
    public async Task<ActionResult> Get(string orderId,
      CancellationToken cancellationToken = default)
    {
      // return the order details
    }
  }

以下是我在向 API 发出请求时收到的响应列表:

  • GET /orders/some_dummy_user_id返回userId="some_dummy_user_id"的订单,可以
  • GET /orders/details/some_dummy_order_id返回orderId="some_dummy_order_id"的详细信息,就可以了
  • GET /orders/details/ 尝试返回与userId="details" 对应的订单,这是不行的

问题是:是否有可能使GET /orders/details/ 请求匹配OrderDetailsController 路由并因此返回404,因为缺少orderId URL 参数?

【问题讨论】:

  • 控制器有一个反序列化方法,可以解析响应并创建类。 ActionResult 是已解析数据的类。所以你有一个 Task 并且两者的 T 必须相同。客户端和服务器都有一个控制器。您想要的代码需要在服务器上,而不是客户端上。服务端的控制器解析请求,客户端的控制器解析响应。
  • 恐怕不会。由于userId 参数是一个字符串并且没有约束。 orders/details 将匹配到 {userId:required} 路由,因为没有证据可以区分 orders 单词和 userId 字符串参数。

标签: c# .net routes controller


【解决方案1】:

不幸的是,仅使用 .Net 路由功能似乎无法实现所需的场景。我在这种情况下看到的可能解决方案是:

  1. Serge's answer 中所述,如果userId 匹配子路由,则引入手动检查并抛出404 异常
  2. 更新路由架构以防止出现这种情况

由于我想仅使用 .Net 路由功能来实现这一点,因此我采用了第二种解决方案(尤其是对整体路由架构的影响并不大)。

【讨论】:

    【解决方案2】:

    试试这个

    [Route("api/v{version:apiVersion}/orders")]
      [ApiVersion("1.0")]
      [ApiController]
      public class OrdersController: ControllerBase
      {
    
        [HttpGet("{userId:required}")]
        public async Task<ActionResult> Get(string userId,
          CancellationToken cancellationToken = default)
        {
          if(userId.ToLower=="details") throw new HttpException(404, "not found");
    
          // return the orders corresponding to the userId
        }
    
     }
    

    【讨论】:

      猜你喜欢
      • 2021-12-09
      • 2014-09-27
      • 2017-11-05
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      相关资源
      最近更新 更多