web-dev-qa-db-fra.com

Problèmes de routage WebAPI Core

Donc, je joue avec l'API Web (ASP.NET Core 2) et j'ai des problèmes de routage.

J'ai plusieurs contrôleurs tels que:

SchoolController
TeacherController.

Les deux ont Gets: Get(int id)

Le problème est que lorsque je l'exécute, j'obtiens une erreur d'exécution avant même de pouvoir réellement invoquer les méthodes.

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

Pourquoi cela ferait-il alors que les contrôleurs devraient avoir leurs propres Gets, etc ... afin que vous puissiez faire:

/api/{controller}/1

etc... ?

Maintenant, j'ai également une autre méthode Get, à la fois dans leurs contrôleurs mais avec une signature de méthode différente avec un nom HttpGet différent, à savoir:

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

Et pour le contrôleur de l'école:

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

Pour être clair - la question est:

  • Pourquoi est-ce que j'obtiens les erreurs d'exécution dès le démarrage de l'application Web?

  • Les get sont sur différents contrôleurs, alors pourquoi y aurait-il des conflits?

18
Ahmed ilyas

Les contrôleurs ne peuvent pas avoir d'actions avec la même Route Name. Ils doivent être uniques pour que la table de routage puisse les différencier.

Référence Routage vers les actions du contrôleur: nom de la route

Les noms de route peuvent être utilisés pour générer une URL basée sur une route spécifique. Les noms de route n'ont aucun impact sur le comportement de correspondance d'URL du routage et sont uniquement utilisés pour la génération d'URL. Les noms de route doivent être uniques à l'échelle de l'application.

c'est moi qui souligne

Mettre à jour les noms des itinéraires

[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

La suppression du nom sur l'action get des deux contrôleurs résoudra le problème

7
fmalh3iro