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?
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
Ajouter un attribut Httpxxx ([HttpGet]
, [HttpPost]
, ...) pour chaque méthode d'action ou [ApiExplorerSettings(IgnoreApi = true)]
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.
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");
});
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)]
.
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.
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.
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.