链接的网址上存在歧义路线匹配

时间:2019-05-05 20:29:10

标签: asp.net-core

我对uri的要求不明确:Toyota-Corolla-vehicles/2我将问题归结为这两条路线

[HttpGet("{make}-vehicles/{makeId:int}")]
[HttpGet("{make}-{query}-vehicles/{makeId:int}")]

对我来说看起来很明确。 uri是否不应该在路线上加上两个破折号?

有关更多背景信息: 我正在使用类似Toyota-vehicles-in-2005的可读网址。所以我不能使用正斜杠来分隔。

[HttpGet("{make}-vehicles-in-{year}/{makeId:int}")]

文档状态:

  

复杂的细分(例如[Route(“ / dog {token} cat”)])是   通过在非贪婪中从右到左匹配文字来进行处理   办法。请参阅源代码以获取描述。有关更多信息,请参见   这个问题。

https://github.com/aspnet/Routing/blob/9cea167cfac36cf034dbb780e3f783114ef94780/src/Microsoft.AspNetCore.Routing/Patterns/RoutePatternMatcher.cs#L296

https://github.com/aspnet/AspNetCore.Docs/issues/8197

1 个答案:

答案 0 :(得分:0)

我建议您使用以下路线:

[HttpGet("{make}/vehicles/{makeId:int}")]
[HttpGet("{make}/{query}/vehicles/{makeId:int}")]

在这种情况下,Toyota/vehicles/2Toyota/Corolla/vehicles/2之间没有歧义。在您的情况下,由于事实{query}string的类型而造成歧义,因此Toyota-Corolla-vehicles字符串与{make}-vehicles{make}-{query}-vehicles都匹配,因为我们可以解析像这样:

  1. 所有{make}参数等于Toyota-Corolla;
  2. {make}-{query}等于Toyota-Corolla,其中{make}Toyota,而{query}Corolla

因此,问题出在您的字符-上。如果您不想更改路线,则只能离开[HttpGet("{make}-vehicles/{makeId:int}")]并通过Toyota-Corolla方法来区分string.Split