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 terminaisonError
est appelée.1 votes
@HelderSepu la configuration 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"; // servir l'interface utilisateur à la racine c.SwaggerEndpoint("/swagger/v1/swagger.json", "V1 Docs"); });
0 votes
J'ai réussi à reproduire votre problème, on dirait un bug dans le Swashbuckle.AspNetCore, le
ResolveConflictingActions
devrait fonctionner0 votes
@HelderSepu le code que vous avez fourni dans votre commentaire ci-dessus a fonctionné pour moi. J'utilise Swashbuckle.AspNetCore(3.0.0) et AspNetCore.All(2.0.9).
0 votes
Dans mon cas, cela s'est produit parce que j'utilisais la même route pour deux API, donc je l'ai corrigée pour utiliser une route unique pour chaque API, puis cela a fonctionné.