web-dev-qa-db-fra.com

Routage conventionnel dans l'API ASP.NET Core

Problème:

Je crée une application API avec NET Core 3.1. Je voudrais éviter de définir l'attribut route sur chaque ApiControllers et actions. J'ai essayé beaucoup de combinaisons sur UseEndpoints pour définir une route conventionnelle, mais j'échoue.

Avec certaines configurations, je ne peux pas faire fonctionner l'API, avec d'autres, j'obtiens cette exception au démarrage:

InvalidOperationException: l'action 'ApiIsWorking' n'a pas de route d'attribut. Les méthodes d'action sur les contrôleurs annotés avec ApiControllerAttribute doivent être routées par attribut.

Comment puis-je définir le startup.cs pour mapper automatiquement les contrôleurs avec leur nom de classe et les actions avec leur nom de méthode?

Je vous remercie!

Un peu de code:

startup.cs

...
services.AddControllers()
...

app.UseHttpsRedirection()
   .UseRouting()
   .UseAuthentication()
   .UseEndpoints(endpoints => ?? )
   .UseCoreHttpContext()
   .UseServerConfiguration();

controller.cs

[ApiController]
public class BaseAPI : ControllerBase 
{
        [HttpGet]
        public string ApiIsWorking()
        {
            return "API is working!";
        }
}

Solution:

Comme Reza Aghaei le dit dans la solution , l'erreur était d'ajouter l'attribut ApiController. Après l'avoir supprimé, la commande UseEndpoints commence à fonctionner.

Mon erreur a été d'ajouter l'attribut pour pouvoir reconnaître quelles classes devraient être exposées via l'API. Ce n'était pas nécessaire car UseEndpoints ne mappe que les classes qui héritent de ControllerBase.

Avertissement:

1) Le routage conventionnel nécessite [FromBody] attribut dans les paramètres des actions.

2) Je souligne réponse de Zinov sur les problèmes de routage conventionnels avec Swashbuckle dans .NET Core

5
Paolo Crociati

Avez-vous essayé cela?

app.UseEndpoints(endpoints => { endpoints.MapControllers(); });

1
Miro Hudak

Voici mon conseil si vous vous engagez dans cette voie en utilisant le routage conventionnel avec .net core. Une fois que vous avez terminé l'implémentation de votre API, vous allez y ajouter de la documentation. Les gens utilisent normalement ce package nuget Swashbuckle.AspNetCore, qui implémente le dernier standard d'OpenAPI (Swagger). Mais voici le problème lorsque vous utilisez le routage conventionnel et que vous souhaitez générer la documentation avec cet outil.

si vous utilisez le routage conventionnel (par opposition au routage d'attributs), tous les contrôleurs et les actions sur ces contrôleurs qui utilisent le routage conventionnel ne seront pas représentés dans ApiExplorer, ce qui signifie que Swashbuckle ne pourra pas trouver ces contrôleurs et générer des opérations Swagger à partir de leur

Pour plus d'informations, reportez-vous à ce lien: Swashbuckle J'espère que cela vous évitera beaucoup de maux de tête à l'avenir avec la documentation de votre api

1
Zinov