J'essaie de configurer un document d'API swagger de base dans un nouveau projet asp .net CORE/MVC 6 et de recevoir une erreur 500 de l'interface utilisateur swagger: 500 : http://localhost:4405/swagger/v1/swagger.json
Ma classe de démarrage contient le code suivant:
using Swashbuckle.SwaggerGen;
using Swashbuckle.SwaggerGen.XmlComments;
using Swashbuckle.Application;
....
public void ConfigureServices(IServiceCollection services)
{
...
services.AddSwaggerGen();
services.ConfigureSwaggerDocument(options =>
{
options.SingleApiVersion(new Info
{
Version = "v1",
Title = "Blog Test Api",
Description = "A test API for this blogpost"
});
});
}
puis sous Configurer:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
....
app.UseSwaggerGen();
app.UseSwaggerUi();
....
}
Lorsque je construis et exécute le projet, l'interface utilisateur apparaît lorsque je vais sur swagger/UI/index.html, mais l'erreur 500 ci-dessus s'affiche. Quand je vais sur le lien swagger/v1/swagger.json, la console donne l’erreur 500 suivante: Failed to load resource: the server responded with a status of 500 (Internal Server Error)
Y at-il un moyen que je puisse comprendre la cause première du 500 ou permettre un débogage supplémentaire dans swagger pour comprendre pourquoi il jette cette erreur? D'après certains des didacticiels que j'ai examinés, seul ce que j'ai au démarrage est requis pour une implémentation de base. S'il vous plaît laissez-moi savoir si je peux fournir des informations supplémentaires.
EDIT: ceci est pour rc1, et peut ne pas être pertinent pour le nouveau netcore 1.0 actuellement disponible (29/06/2016)
Au départ, j'ai aussi une erreur 500. Au fond de la pile, il disait: System.NotSupportedException: verbes HTTP non liés pour le chemin 'api/hotels'. Il vous manque un HttpMethodAttribute?
Il s'est avéré qu'il me manquait un attribut HttpGet pour l'une de mes méthodes api:
[Microsoft.AspNetCore.Mvc.HttpGet]
J'ai eu cette erreur quand une de mes fonctions a été marquée comme public
, mais n'était pas destiné à être un service Web qui pourrait être appelé directement.
Changer la fonction en private
a fait disparaître l'erreur.
Autrement, immédiatement avant votre fonction public
, vous pouvez mettre la commande [NonAction]
pour indiquer à Swagger de l’ignorer.
[NonAction]
public async Task<IActionResult> SomeEvent(string id)
{
...
}
(J'aimerais que Swagger rapporte réellement le nom de la fonction qui a causé ce problème, plutôt que de se plaindre de ne plus pouvoir trouver le fichier "../swagger/v1/swagger.json" ... ce n'est pas particulièrement utile.)
Tout d'abord, vous pouvez activer la page d'exception de développeur en ajoutant app.UseDeveloperExceptionPage();
sur votre Configure () afin de mieux identifier la cause. Jetez un coup d'oeil ici
Dans mon cas, le problème était que je devais installer aussi le nuget Microsoft.AspNetCore.StaticFiles
pour que Swagger fonctionne.
Essayez également de désinstaller/réinstaller Swashbuckle.AspNetCore
nuget.
Cela pourrait être évident, mais, en plus de manquer les attributs HttpGet
ou HttpPost
, n'oubliez pas de différencier les méthodes de publication.
Vous pouvez avoir 2 méthodes différentes (avec des noms différents) marquées avec HttpPost
, et cela pourrait également causer ce type de problème. N'oubliez pas de spécifier le nom de la méthode dans l'attribut: [HttpPost("update")]
.
J'obtenais cette erreur parce que dans STARTUP.CS, je n'ai pas mis le nom de la version dans les paramètres SwaggerDoc:
Erreur => c.SwaggerDoc("", blablabla
TRAVAIL => c.SwaggerDoc("v1",blablabla
alors, maintenant ça va, d'accord!
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info {Title = "PME SERVICES", Version = "v1"});
});
Pour voir la source de l'exception
Quand j'ajoute le paramètre Version, ça marche
services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
});
Aussi eu ce problème. Dans mon cas, cela était dû à deux points de terminaison dans le même contrôleur avec le même chemin et le même nom de méthode (mais avec des types de paramètres différents). Bien sûr, il est devenu évident que c'était probablement une mauvaise pratique de toute façon, alors j'ai changé les noms des points de terminaison et tout allait bien.
Aussi, si je peux ajouter, la configuration en fanfaronne ne l’aime pas lorsque vous vous dirigez au niveau racine de vos contrôleurs. Par exemple:
Ne faites pas cela:
[Produces("application/json")]
[Route("/v1/myController")]
[Authorize]
public class myController
{
[SwaggerResponse((int)System.Net.HttpStatusCode.OK, Type = typeof(RestOkResponse<Response>))]
[SwaggerResponse((int)System.Net.HttpStatusCode.InternalServerError, Type = typeof(RestErrorResponse))]
[SwaggerResponse((int)System.Net.HttpStatusCode.BadRequest, Type = typeof(RestErrorResponse))]
[SwaggerResponse((int)System.Net.HttpStatusCode.Forbidden, Type = typeof(RestErrorResponse))]
[SwaggerResponse((int)System.Net.HttpStatusCode.NotFound)]
[HttpPost]
[Authorize()]
public async Task<IActionResult> Create([FromBody] MyObject myObject)
{
return Ok();
}
}
Faire ceci:
[Produces("application/json")]
[Authorize]
public class myController
{
[SwaggerResponse((int)System.Net.HttpStatusCode.OK, Type = typeof(RestOkResponse<Response>))]
[SwaggerResponse((int)System.Net.HttpStatusCode.InternalServerError, Type = typeof(RestErrorResponse))]
[SwaggerResponse((int)System.Net.HttpStatusCode.BadRequest, Type = typeof(RestErrorResponse))]
[SwaggerResponse((int)System.Net.HttpStatusCode.Forbidden, Type = typeof(RestErrorResponse))]
[SwaggerResponse((int)System.Net.HttpStatusCode.NotFound)]
[HttpPost("/v1/myController")]
[Authorize()]
public async Task<IActionResult> Create([FromBody] MyObject myObject)
{
return Ok();
}
}
Il m'a fallu un certain temps pour comprendre que la cause de mon erreur de serveur interne était due à ce problème de routage. J'espère que cela aide quelqu'un!
dans certains cas, le routeur du contrôleur est dupliqué. Examinez le dernier contrôleur modifié.