Проблемы с маршрутизацией WebAPI Core

Итак, я играю с Web API (ASP.NET Core 2) и имеет проблемы с маршрутизации.

У меня есть несколько контроллеров, таких как:

SchoolController
TeacherController.

Оба имеют Gets: 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 i.e:

// 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) {
        //...
    }
}

Ответ 2

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