Основные проблемы маршрутизации WebAPI
Итак, я играю с Web API (ASP.NET Core 2) и имею проблемы с маршрутизацией.
У меня есть несколько контроллеров, таких как:
SchoolController
TeacherController.
У обоих есть: Get(int id)
Проблема в том, что когда я его запускаю, я получаю сообщение об ошибке во время выполнения даже до того, как могу вызвать методы.
Attribute routes with the same name 'Get' must have the same template:
Action: MyProject.WebAPI.Controllers.SchoolController.Get (MyProject.WebAPI)' - Template: 'api/school/{id}'
Action: MyProject.WebAPI.Controllers.TeacherController.Get (MyProject.WebAPI)' - Template: 'api/teacher/{id}'
Зачем это делать, если у контроллеров должны быть свои Gets и т. Д., Так что вы можете сделать:
/api/{controller}/1
etc... ?
Теперь у меня также есть другой метод Get, оба в своих контроллерах, но с другой сигнатурой метода и другим именем HttpGet, т.е.
// TeachersController:
[Produces("application/json")]
[Route("api/teacher")]
public class TeacherController : Controller
{
// GET: api/Teacher/5
[HttpGet("{id}", Name = "Get")]
public IActionResult Get(int id)
{
// BLAH
}
}
И для школьного диспетчера:
[Produces("application/json")]
[Route("api/school")]
public class SchoolController : Controller
{
[HttpGet("{id}", Name = "Get")]
public IActionResult Get(int id)
{
// BLAH
}
[HttpGet("SearchBasic")]
public IActionResult SearchBasic(string schoolName, string zipCode)
{
// BLAH
}
}
Чтобы было понятно - вопрос такой:
Почему я получаю ошибки времени выполнения при запуске веб-приложения?
Получаются на разных контроллерах, так почему бы возникли конфликты?
1 ответ
Контроллеры не могут иметь действия с одним и тем же маршрутом Name
, Они должны быть уникальными, чтобы таблица маршрутов могла их дифференцировать.
Ссылка маршрутизации на действия контроллера: имя маршрута
Имена маршрутов можно использовать для создания URL-адреса на основе определенного маршрута. Имена маршрутов не влияют на поведение маршрутизации при сопоставлении URL-адресов и используются только для генерации URL-адресов. Имена маршрутов должны быть уникальными для всего приложения.
акцент мой
Обновить названия маршрутов
[Route("api/teacher")]
public class TeacherController : Controller {
// GET: api/Teacher/5
[HttpGet("{id}", Name = "GetTeacher")]
public IActionResult Get(int id) {
//...
}
}
[Route("api/school")]
public class SchoolController : Controller
{
// GET: api/school/5
[HttpGet("{id}", Name = "GetSchool")]
public IActionResult Get(int id) {
//...
}
}
Удаление имени при получении действия с обоих контроллеров решит проблему