Привязка параметров (строка к int) в Web API Core 3.1 - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть два метода GET в моем контроллере.

[HttpGet("{userId:int}", Name= nameof(GetUserById))]
GetUserById 

и

[HttpGet("{name:alpha}", Name=nameof(GetUserByName))]
GetUserByName

К сожалению, существует пользователь с именем «007». Когда я вызываю http://api/Users/007, вызывается первый метод, поскольку система обрабатывает его как целое число со значением 7.

Любые возможные способы перенаправить запрос на второй метод без сделать это параметром запроса?

1 Ответ

0 голосов
/ 26 февраля 2020

Я звоню 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 в своем намерении, и если значение параметра может соответствовать нескольким конечным точкам, создайте различные маршруты конечных точек. Таким образом, маршрутизатор направит запрос к нужному действию, вместо того, чтобы пытаться найти наилучшее совпадение, которое может быть не самым лучшим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...