web-dev-qa-db-fra.com

Swashbuckle/Swagger + ASP.Net Core: "Impossible de charger la définition de l'API"

Je développe une application ASP.NET Core 2 et Swagger inclus. Tout a bien fonctionné jusqu'à ce que je présente une méthode sans définir explicitement l'action HTTP:

public class ErrorController : Controller
{
    [Route("/error")]
    public IActionResult Index()
    {
        return StatusCode(500, new Error("Internal error."));
    }
}

Lorsque j'ai lancé l'application avec cette méthode, le message suivant s'est affiché:

Impossible de charger la définition de l'API.

Les erreurs
Erreur de récupération Erreur interne du serveur /swagger/v1/swagger.json

Dès que je mets explicitement, par exemple, [HttpGet] l'erreur disparaît. Le problème, c’est que j’ai besoin de cette méthode pour déclencher toutes les opérations HTTP possibles. Bien sûr, je pourrais spécifier toutes les opérations de manière explicite, mais j’ai le sentiment que Swagger devrait pouvoir gérer cela correctement.

Pourquoi Swagger se comporte-t-il de cette façon?

Y at-il une configuration que je peux utiliser?

17
Ash

L'option ResolveConflictingActions devrait fonctionner dans ce cas ...

Voici l'erreur réelle:

System.NotSupportedException: Ambiguous HTTP method for action

Cela provient de: https://github.com/domaindrivendev/Swashbuckle.AspNetCore/blob/master/src/Swashbuckle.AspNetCore.SwaggerGen/Generator/SwaggerGenerator.cs#L90

Je pense que c'est un bug, si vous êtes vraiment intéressé, vous devriez le signaler au projet

5

Ajouter un attribut Httpxxx ([HttpGet], [HttpPost], ...) pour chaque méthode d'action ou [ApiExplorerSettings(IgnoreApi = true)]

11
LiKui

Je ne sais pas si cela a été résolu ou non, mais vous pouvez y parvenir en décorant la méthode avec

[ApiExplorerSettings(IgnoreApi = true)]

Cela garantira que la méthode en question est ignorée par Swagger.

4
Moshood Aminu

Un autre problème possible est que le noeud final doit être terminé à partir de la racine du domaine.

J'ai eu:

app.UseSwaggerUI(c =>
{
     c.SwaggerEndpoint("/swagger/v1/swagger.json", "V1 Docs");
});

Je devais utiliser:

 app.UseSwaggerUI(c=>
{
     c.SwaggerEndpoint("/myApi/swagger/v1/swagger.json", "V1 Docs");

});
1
Erick

Swagger lève également la même exception s'il existe des méthodes publiques qui ne sont pas des actions dans un contrôleur. Le correctif consiste à tous les rendre protected ou private ou comme mentionné ajouter l'attribut [ApiExplorerSettings(IgnoreApi = true)].

1
Elphas Tori

J'avais aussi cette erreur parce que j'ai créé un contrôleur qui n'a pas [Route("api/[controller]")]. Après l'avoir mis, l'erreur est partie.

0
t-prisar

Je recevais une TypeLoadException sur une classe que je supprimais et qui était inutilisée. La solution dans mon cas était de supprimer le contenu du dossier bin/obj/Debug. Solution propre + solution de reconstruction n'a pas résolu pour moi. 

0
daniel.caspers

Dans ASP.NET Core, s’il existe un noeud final de contrôleur tel que:

[Route("images")]
[HttpGet("{id}")]

Cela peut également échouer avec l'extraction échouée. La solution est d'avoir quelque chose comme

[HttpGet("images/{id}")]

Même chose pour HttpPost.

0
dansc