Основные проблемы маршрутизации 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) {
        //...
    }
}

Удаление имени при получении действия с обоих контроллеров решит проблему

Другие вопросы по тегам