Я звоню http://api/Users/007, вызывается первый метод, поскольку система обрабатывает его как целое число со значением 7.
Указанный URL не соответствует маршруту GetUserByName
из-за ограничения маршрута. alpha
ограничение принимает только буквы, а не цифры. Вы должны изменить свое ограничение на менее ограничивающее, которое принимает числа в параметре или вообще снимает ограничения. См .: Ссылка на ограничение маршрута
Самый надежный способ различить эти два - использовать разные шаблоны:
[HttpGet("{userId:int}", Name= nameof(GetUserById))] // leave it as is
GetUserById
<...>
[HttpGet("name/{name}", Name=nameof(GetUserByName))] // add segment to route
GetUserByName
ASP. NET маршрутизатор не имеет знание того, что «007» следует рассматривать как строку только потому, что есть такой пользователь. Вы должны более точно указать c в своем намерении, и если значение параметра может соответствовать нескольким конечным точкам, создайте различные маршруты конечных точек. Таким образом, маршрутизатор направит запрос к нужному действию, вместо того, чтобы пытаться найти наилучшее совпадение, которое может быть не самым лучшим.