Несколько действий веб-API ASP.NET Core с одним и тем же глаголом действия, но с другой подписью

скажем, у меня есть

[HttpPost]
public ActionResult<Object> Login([FromBody]LoginViewModel loginViewModel)
  {
    ....
  }

[HttpPost]
public ActionResult Logout()
  {
    ....
  }

в том же контроллере.

И я получаю AmbiguousActionException: совпадение нескольких действий. Следующие действия соответствовали данным маршрута и удовлетворяли всем ограничениям:

...Вход в систему
...Выход из системы

Я могу просто исправить это, используя атрибут маршрута, но я не понимаю, почему ядро ​​​​не связывает его. Я имею в виду, что подпись другая. ?


person john    schedule 11.08.2018    source источник
comment
Что-то не так с вопросом... действия другие; так что подпись не имеет значения!   -  person Felix    schedule 11.08.2018
comment
@Felix, это веб-API...   -  person john    schedule 11.08.2018
comment
Я понимаю, что... так? http://server/account/Login будет соответствовать одному действию, а http://server/account/Logout — другому (примечание: выход из системы обычно означает «Получить», а не «Отправить»).   -  person Felix    schedule 11.08.2018


Ответы (1)


Механизм маршрутизации для веб-API, как Core, так и .NET Framework, работает одинаково. Сначала они учитывают имя контроллера, затем ищут правильный метод http и, наконец, проверяют, совпадают ли параметры строки запроса (или параметры, содержащиеся в URL-адресе, указанном с помощью Route). Итак, если ваши 2 действия будут отличаться параметрами, взятыми из URL-адреса, то двусмысленности нет. Параметры, передаваемые телом, не анализируются механизмом маршрутизации, даже если они есть или их нет. Это связано с тем, что параметры, поступающие по URL-адресу, представляют собой простые строки, с которыми легко сравнивать. В то время как тело — это json, и его сложнее анализировать. На самом деле в случае метода Login в запросе нет параметра loginViewModel - все тело запроса сериализуется в объект LoginViewModel.

person mr100    schedule 11.08.2018