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?
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) {
//...
}
}
Das Entfernen des Namens beim Abrufen einer Aktion von beiden Controllern löst das Problem