Swashbuckle/Swagger + ASP.Net Core: “Échec du chargement de l'API définition de”
Je développe un ASP.NET Core 2 application et inclus Swagger. Tout a bien fonctionné jusqu'à ce que j'ai présenté 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."));
}
}
Quand j'ai commencé l'application de cette méthode, le message suivant a montré jusqu':
Échec du chargement de définition de l'API.
Erreurs
Chercher l'erreur Interne au Serveur Erreur /swagger/v1/swagger.json
Dès que je l'ai définie explicitement par exemple [HttpGet]
l'erreur disparaît. Le problème avec ceci est que, j'ai besoin de cette méthode à feu pour tous les possibles HTTP opérations.
Bien sûr, je pourrais spécifier toutes les opérations de manière explicite, mais j'ai le sentiment Swagger doit être capable de gérer cela correctement.
Pourquoi ne Swagger se comporter de cette façon?
Est-il de la configuration que je peux utiliser?
- "J'ai besoin de cette méthode à feu pour tous les possibles HTTP opérations" pourquoi avez-vous besoin d'un soutien à toutes les méthodes, plutôt que d'en OBTENIR?
- Pouvez-vous partager votre Swashbuckle de configuration?
- dans ce cas, le
Error
point de terminaison est utilisé en tant que gestionnaire d'exception. Selon l'opération de HTTP de la requête, la fonction de l'opération sur leError
extrémité est appelée. - la config est assez simple:
services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new Info { Title = "My Service", Version = "v1" }); }); app.UseSwagger(c => { c.PreSerializeFilters.Add((swagger, httpReq) => swagger.Host = httpReq.Host.Value); }); app.UseSwaggerUI(c => { c.RoutePrefix = "swagger"; // serve the UI at root c.SwaggerEndpoint("/swagger/v1/swagger.json", "V1 Docs"); });
- J'ai réussi à reproduire votre problème, ressemble à un Bug dans le Swashbuckle.AspNetCore, le
ResolveConflictingActions
devrait fonctionner - le code que vous avez fourni dans votre commentaire ci-dessus a fonctionné pour moi. Je suis l'aide de Swashbuckle.AspNetCore(3.0.0) et AspNetCore.Tous(2.0.9).
Vous devez vous connecter pour publier un commentaire.
L'option ResolveConflictingActions devrait travailler sur ce cas...
Voici l'erreur:
Qui est à venir à partir 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 devez le signaler au projet
Ajouter Httpxxx(
[HttpGet]
,[HttpPost]
, ...) attribut pour chaque méthode d'Action, ou[ApiExplorerSettings(IgnoreApi = true)]
Je ne sais pas si cela a été résolu ou non, mais d'une façon, vous pouvez aller à ce sujet est par la décoration de la méthode:
Cela permettra d'assurer que la méthode en question est ignorée par Swagger.
Un autre problème possible est que le point de terminaison doit être complet à partir de la racine du domaine.
J'ai eu:
J'ai eu à utiliser:
Dans ASP.NET de Base, si il y a un contrôleur de point de terminaison comme:
Cela peut aussi échouer avec fetch a échoué. La solution est d'avoir quelque chose comme
Même chose pour HttpPost.
Swagger jette aussi de la même exception s'il existe des méthodes publiques qui ne sont pas des actions dans un contrôleur. La solution est de faire tous
protected
ouprivate
ou comme mentionné ajouter l'attribut[ApiExplorerSettings(IgnoreApi = true)]
.protected
.J'ai été faire un
TypeLoadException
sur une classe que j'ai été la suppression qui a été utilisé. La solution dans mon cas, a été de supprimer les bin/obj/Debug du contenu du dossier. Nettoyer la solution + régénérer la solution ne résout pas pour moi.J'avais aussi cette erreur car j'ai créé un contrôleur qui dosent ont
[Route("api/[controller]")]
. Après avoir, l'erreur a disparu.Mon erreur raison était la même url, nom,
Je utiliser la même url, et swagger ne peut pas les obtenir