Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException:请求匹配多个端点
Posted
技术标签:
【中文标题】Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException:请求匹配多个端点【英文标题】:Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: The request matched multiple endpoints 【发布时间】:2021-09-02 04:06:00 【问题描述】:我有一个 ASP.Net Core WebAPI,我的要求低于
我有 2 种方法来处理 HTTP GET 请求,第一种方法通过 id(string
) 发送给 GetCustomer,另一种通过电子邮件发送给 GetCustomer(string
)。
//GET : api/customers/2913a1ad-d990-412a-8e30-dbe464c2a85e
[HttpGet("id")]
public async Task<ActionResult<Customer>> GetCustomer([FromRoute]string id)
// GET: api/customers/myemail@gmail.com
[HttpGet("name")]
public async Task<ActionResult<Customer>> GetCustomerByEmail([FromRoute]string email)
当我尝试访问此端点时,我得到以下异常:
Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: The request matched multiple endpoints.
这很明显和理解。
可以通过在路由中附加/前置一些字符串来轻松解决,例如
/api/customer/id
/api/customer/emai/id
但是对这个方法不太相信,但是在谷歌搜索时我得到了下面的 SO 链接
How to handle multiple endpoints in ASP.Net Core 3 Web API properly但是这家伙有一个参数是 int 而另一个是 string 所以路由约束被救了。
但是,我看到有人在同一个帖子上发帖/建议添加[Route("")]
,但我不明白这个属性有什么用?
afaik, Route("")
和 HTTPGet("")
//任何 HttpVerb 都有相同的用途?
无论如何,我怎样才能优雅地处理我的要求?
【问题讨论】:
【参考方案1】:您可以添加route constraints 以消除两条路线之间的歧义:
[HttpGet("id:guid")]
[HttpGet("name")]
您还可以创建自己的email
约束或使用regex(.)
约束作为电子邮件参数。
【讨论】:
如果 id 是常规字符串会怎样 那么也许您可以在第二个约束中添加email
约束?如果不是,这两个 不能 被消除歧义 - 如果两者都可以是 any string,ASP.NET Core 将如何知道调用哪个路由?以上是关于Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException:请求匹配多个端点的主要内容,如果未能解决你的问题,请参考以下文章