web-dev-qa-db-fra.com

500 Erreur lors de la configuration de Swagger dans une application asp .net CORE/MVC 6

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)

27
CBerg

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]
68
hsop

Si quelqu'un veut savoir que l'erreur exacte se trouve dans la trace de pile de Swagger, demandez l'URL:

<your-app-url>/swagger/v1/swagger.json

Ou cliquez sur le lien swagger.json dans la console des outils de développement du navigateur:

 Chrome DevTools with error log

11
Zin Min

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.)

3
Mike Gledhill

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.

3
Popa Andrei

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"});
            });
0
Diego Venâncio

Pour voir la source de l'exception

  • navigateur chrome ouvert 
  • outils de développement ouverts
  • voir les exceptions dans l'onglet console
  • répare le.
0
ddagsan

Quand j'ajoute le paramètre Version, ça marche

services.AddSwaggerGen(options =>
        {
            options.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
        });
0

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.

0
bsigma1

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! 

0
Lostaunaum

dans certains cas, le routeur du contrôleur est dupliqué. Examinez le dernier contrôleur modifié.

0
Michelle Rodrigues