wake-up-neo.com

Probleme mit dem WebAPI Core-Routing

Ich spiele also mit der Web-API (ASP.NET Core 2) und habe Routing-Probleme.

Ich habe mehrere Controller wie:

SchoolController
TeacherController.

Beide haben Gets: Get(int id)

Das Problem ist, dass ich beim Ausführen einen Laufzeitfehler erhalte, bevor ich die Methoden überhaupt aufrufen kann.

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}'

Warum sollte es das tun, wenn die Controller ihre eigenen Gets usw. haben sollten, damit Sie Folgendes tun können:

/api/{controller}/1

etc... ?

Jetzt habe ich auch eine andere Get-Methode, beide in ihren Controllern, aber mit einer anderen Methodensignatur zusammen mit einem anderen HttpGet-Namen, d. H .:

// 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
    }
}

Und für den Schulleiter:

[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
    }
}

Um klar zu sein - die Frage ist:

  • Warum erhalte ich die Laufzeitfehler, sobald die Web-App gestartet wird?

  • Die get's sind auf verschiedenen Controllern, warum sollte es also Konflikte geben?

18
Ahmed ilyas

Controller können keine Aktionen mit derselben Route Name ausführen. Sie müssen eindeutig sein, damit die Routentabelle sie unterscheiden kann.

Referenz Routing zu Controller-Aktionen: Routenname

Routennamen können verwendet werden, um eine URL basierend auf einer bestimmten Route zu generieren. Routennamen haben keinen Einfluss auf das URL-Abgleichsverhalten des Routings und werden nur zur URL-Generierung verwendet. Routennamen müssen anwendungsweit eindeutig sein.

Hervorhebung von mir

Routennamen aktualisieren

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

Das Entfernen des Namens beim Abrufen einer Aktion von beiden Controllern löst das Problem

7
fmalh3iro