Kgn-web
Kgn-web

Reputation: 7555

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

I have an ASP.Net Core WebAPI, I got below requirement as

I have 2 methods to handle HTTP GET requests, the first one for GetCustomer by id(string) and the other one to GetCustomer by email(string).

//GET : api/customers/2913a1ad-d990-412a-8e30-dbe464c2a85e
[HttpGet("{id}")]
public async Task<ActionResult<Customer>> GetCustomer([FromRoute]string id) 
{
   
}

// GET: api/customers/[email protected]
[HttpGet("{name}")]
public async Task<ActionResult<Customer>> GetCustomerByEmail([FromRoute]string email) 
{
   
}

when I try to this Endpoint, I get exception as:

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

Which is quite Obivious & understood.

It could be easily addressed by appending/prepending some string in the route like

/api/customer/{id}

/api/customer/emai/{id}

However not so convinced with this apporach however on googling I get the below SO link

But this guy has one parameter as int while the other as string so route constraint rescued.

however, I see some people posting/suggesting on the same post to add [Route("")] but I didn't get how this attribute is useful ?

afaik, Route("") and HTTPGet("") //any HttpVerb serves the same purpose?

Anyways how could I handle my requirement elegantly?

Upvotes: 2

Views: 7896

Answers (1)

Jan Joneš
Jan Joneš

Reputation: 938

You can add route constraints to disambiguate between the two routes:

[HttpGet("{id:guid}")]

[HttpGet("{name}")]

You could also create your own email constraint or use regex(.) constraint for the email parameter.

Upvotes: 5

Related Questions