ASP.NET 核心 API 控制器模糊方法问题

ASP.NET Core API Controller ambiguous method issue

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

我已经创建 ASP.NET 核心 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) 
{
}

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

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

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

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

顺序 属性 区分了这两种方法。

最佳做法可能是向每个方法添加顺序 属性。

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

[编辑]

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

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

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

现在建立了以下结构

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

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

public IEnumerable<ListingsAndReviews> GetById(Guid id)

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

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

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

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

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

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