【问题标题】:ASP.NET Core API Controller ambiguous method issueASP.NET Core API Controller 模糊方法问题
【发布时间】:2021-03-09 16:41:10
【问题描述】:

我遇到了这个问题,找不到快速指南,所以我在这里。

我已经创建了 ASP.NET Core API。

在一个控制器上,我定义了 2 个 get 方法。每个接受不同的参数,但都是字符串。这会产生以下问题。

Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: The request matched multiple endpoints. Matches: 

Airbnb.Controllers.ListingsAndReviewsController.GetById (Airbnb)
Airbnb.Controllers.ListingsAndReviewsController.GetByName (Airbnb)

我的方法看起来像这样。

[HttpGet("{id}")]
public IEnumerable<ListingsAndReviews> GetById(String id)
{
}

[HttpGet("{name}")]
public IEnumerable<ListingsAndReviews> GetByName(String name) 
{
}

【问题讨论】:

  • 设身处地为 url 路由器思考问题,路由器应该为site.com/ListingsAndReviews/gibberish-string 这样的 url 调用哪种方法?您的路由器不知道 gibberish-string 是 id 还是 name。因此,帮助它找到匹配项,将您的 url 模板更改为每种方法的不同内容。
  • 你确定 id 是一个字符串吗?
  • @Nonik id 在技术上是一个 ObjectId,但我只能将 Id 作为字符串输入,然后将其转换为 ObjectId。查询是使用 ObjectId 完成的。我可能会改变它,一旦我建立了一个前端......

标签: c# asp.net-core model-view-controller


【解决方案1】:

如您所见,这些方法的名称不同,但它们具有相同的参数,这会导致问题。

要解决此问题,您必须为 HttpGet 方法属性设置新的 Property "Order"。

[HttpGet("id/{id}", Order = 0)]
public IEnumerable<ListingsAndReviews> GetById(String id)
{
}

[HttpGet("name/{name}", Order = 1)]
public IEnumerable<ListingsAndReviews> GetByName(String name) 
{
}

Order 属性区分这两种方法。

最佳实践可能是将 order 属性添加到每个方法中。

希望这可以帮助某人,如果没有,请随时提出更好的解决方案。

[编辑]

我最终得到了模板的以下结构

"id/{id}"
"name/{name}"

这会强制路由首先设置过滤参数,然后设置值。

以下结构现已建立

localhost/ListingsAndReviews
localhost/ListingsAndReviews/id/1
localhost/ListingsAndReviews/name/SomeName

【讨论】:

  • 这个答案如何解决您的问题?您自己更改了路线,{id}id/{id}{name}name/{name}。你真的需要在这里使用Order吗?
【解决方案2】:

我不得不问:你确定“ID”不会是整数或 guid 或类似的东西吗? 如果是这种情况,您可以直接在操作中使用预期的类型:

public IEnumerable<ListingsAndReviews> GetById(Guid id)

这是一个真正的字符串(作为名称),您可以使用route parameter constraint

这样您就可以定义“ID”的外观和名称的外观。

例如,如果您知道 ID 最多只能包含 5 个字符,您可以这样做:

[HttpGet("{id:maxlength(5)}")]

我只是给了你机制,但你的问题的具体答案将取决于:ID 是什么样的? (我猜名字可以是任何东西......)。

如果您无法区分 ID 和名称,则不应有 2 个端点(但也许在一个端点中,您可以搜索一次 ID 和一次作为后备的名称)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 2010-11-05
    • 2021-07-26
    • 2019-04-30
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    相关资源
    最近更新 更多