143 votes

Swashbuckle/Swagger + ASP.Net Core : "Échec du chargement de la définition de l'API"

Je développe une application ASP.NET Core 2 et j'ai inclus Swagger. Tout fonctionnait bien jusqu'à ce que j'introduise une méthode sans définir explicitement l'action HTTP :

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

Quand j'ai démarré l'application avec cette méthode, le message suivant est apparu :

Échec du chargement de la définition de l'API.

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

Dès que j'ai défini explicitement par exemple [HttpGet], l'erreur a disparu. Le problème est que j'ai besoin que cette méthode soit déclenchée pour toutes les opérations HTTP possibles. Bien sûr, je pourrais spécifier toutes les opérations explicitement, mais j'ai l'impression que Swagger devrait pouvoir gérer cela correctement.

Pourquoi Swagger se comporte-t-il de cette manière ?

Y a-t-il une configuration que je peux utiliser ?

services.AddSwaggerGen(c => 
{   
  c.SwaggerDoc("v1", new Info { Title = "Mon Service", Version = "v1" }); 
});  

app.UseSwagger(c => 
{   
  c.PreSerializeFilters.Add((swagger, httpReq) => swagger.Host = httpReq.Host.Value); 
});  

app.UseSwaggerUI(c => 
{   
  c.RoutePrefix = "swagger"; // servir l'interface utilisateur à la racine     
  c.SwaggerEndpoint("/swagger/v1/swagger.json", "Docs V1"); 
})

2 votes

' J'ai besoin que cette méthode soit déclenchée pour toutes les opérations HTTP possibles ' pourquoi faudrait-il prendre en charge toutes les méthodes, plutôt que seulement GET ?

0 votes

Pouvez-vous partager votre configuration Swashbuckle ?

0 votes

@Dans ce cas, le point de terminaison Error est utilisé comme gestionnaire d'exception. Selon l'opération HTTP de la requête, l'opération correspondante sur le point de terminaison Error est appelée.

123voto

LiKui Points 261

Assurez-vous que chaque méthode de contrôleur public possède :

  • soit l'attribut Httpxxx ([HttpGet], [HttpPost], ...) pour les méthodes d'action,
  • soit [ApiExplorerSettings(IgnoreApi = true)] pour les méthodes qui ne sont pas des actions de contrôleur

2 votes

Cela a fonctionné dans mon cas : il y avait quelques méthodes d'action publiques qui utilisaient GET, mais pas explicitement.

0 votes

Parce que cette réponse est utile aux personnes qui viennent sur cette page pour l'erreur, même si la cause n'est pas identique à celle de l'OP

0 votes

L'utilisation de [ApiExplorerSettings(IgnoreApi = true)] fonctionne parfaitement, lorsque je l'ai utilisé uniquement pour un routage "/Erreur". Merci!

92voto

Tout simplement, vous pouvez regarder le journal dans la fenêtre de Sortie. L'erreur réelle peut être vue là-bas. Dans mon cas, j'ai oublié d'ajouter une action HTTP au-dessus d'une méthode

entrer la description de l'image ici

0 votes

Oui, lorsque swagger se charge appuyez sur f12 et ensuite nous avons plus de détails :)

0 votes

Cela m'a aidé à trouver la réponse. Le problème était une méthode d'aide public dans un contrôleur. Je l'ai changée en protected - le fichier swagger se génère de nouveau.

44voto

Helder Sepulveda Points 4117

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

Voici l'erreur actuelle :

System.NotSupportedException: Méthode HTTP ambiguë pour l'action

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

Je pense qu'il s'agit d'un bogue, si vous êtes vraiment intéressé, vous devriez le signaler au projet

5 votes

Pour ASP.net core 3, j'ai dû ajouter ResolveConflictingActions dans ma section AddSwaggerGen dans le fichier startup > c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());

0 votes

Le lien donné n'est pas trouvé..!

1 votes

Oui, dans mon cas, j'ai gardé la même URL pour deux APIs différents.

21voto

Moshood Aminu Points 81

Je ne sais pas si cela a été résolu ou non mais une façon de procéder est de décorer la méthode avec :

[ApiExplorerSettings(IgnoreApi = true)]

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

17voto

Erick Points 443

Un autre problème possible est que le point d'extrémité doit être complet à partir de la racine du domaine.

J'avais :

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

J'ai dû utiliser :

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

});

4 votes

Une autre solution consiste à utiliser c.SwaggerEndpoint("v1/swagger.json", "V1 Docs");. Cela devrait fonctionner pour les URL relatives et absolues.

1 votes

C'est ce que j'ai causé mon problème.

0 votes

Cela c.SwaggerEndpoint("v1/swagger.json", "V1 Docs"); a fonctionné pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X