【问题标题】:How to resolve conflict between endpoints?如何解决端点之间的冲突?
【发布时间】:2022-01-04 16:45:45
【问题描述】:

假设我有两个端点:

[HttpGet ("{serialNumber}")]

[HttpGet ("summary")].

因此,我的应用程序将 api/summary 视为 api/{serialNumber} 其中 {serialNumber} = "summary" 并且我得到了我想要的错误行为。

【问题讨论】:

  • 简单:使用明确的路线?喜欢[HttpGet("sn/{serialNumber}")]。另外:我推荐taking the tour,以及阅读how to ask a good questionwhat's on topic
  • @FranzGleichmann 这是唯一的解决方案吗?还有另一个项目,一切都是一样的,但同时它也能正常工作。
  • 虽然它可能不是唯一的解决方案 - 例如,取决于您可以输入提示的序列号格式 - 它是最好的解决方案。它是干净的。它与数据的格式无关。这是可以理解的。 (如果它在另一个项目中工作 - 看看那个人正在做的事情。如果你想不通,问谁写的)

标签: c# asp.net .net


【解决方案1】:

我在我的机器上用不同的 sdks 进行了尝试:net3.1、.net5 和 .net6
...按预期工作。


[HttpGet("values/summary")]
public IActionResult GetSummary()
{
   return Ok(new ValueObject[] { new ValueObject { Value = "SUMMARY" } });
}

[HttpGet("values/{serialNumber}")]
public IActionResult GetBySerial([FromRoute] string serialNumber)
{
   return Ok(new ValueObject[] { new ValueObject { Value = serialNumber } });
}

如果我现在打电话给/values/summary,结果是

{
  "value": "SUMMARY"
}

如果我打电话给/values/abcde,结果是

{
  "value": "abcde"
}

所以在我看来,如果您从来没有{serialNumber} == 'summary',那么这个 API 应该能够以正确的方式工作。

如果您可能遇到'summary' == {serialNumber} 的情况,请使用显式端点,而不是像之前描述的那样 (@Serge)。

【讨论】:

    【解决方案2】:

    解决它的唯一方法是在路由中添加动作名称

    [HttpGet ("GetSerialNumber/{serialNumber}")] 
    public ActionResult GetSerialNumber(string serialNumber)
    
    and 
    
    [HttpGet ("GetSummary/{summary}")] 
    public ActionResult GetSummary(string summary)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      相关资源
      最近更新 更多