web-dev-qa-db-fra.com

ASP.NET Core - Swashbuckle ne crée pas de fichier swagger.json

Je ne parviens pas à obtenir le package Swashbuckle.AspNetCore (1.0.0) pour générer une sortie. J'ai lu le fichier swagger.json devrait être écrit dans '~/swagger/docs/v1'. Cependant, je ne reçois aucune sortie.

J'ai commencé avec un tout nouveau projet d'ASP.NET Core API. Je devrais mentionner que c’est ASP.NET Core 2. L’API fonctionne, et j’ai la possibilité de récupérer des valeurs à partir du contrôleur de valeurs. 

Ma classe de démarrage a exactement la configuration décrite dans cet article ( Swashbuckle.AspNetCore sur GitHub ).

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

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

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();

            // Enable middleware to serve generated Swagger as a JSON endpoint.
            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyAPI V1");
            });
        }
        else
        {
            app.UseExceptionHandler();
        }

        app.UseStatusCodePages();
        app.UseMvc();

        //throw new Exception();
    }
}

Vous pouvez voir les références NuGet ...

 enter image description here

Encore une fois, c'est tout le modèle par défaut, mais j'inclus le ValuesController pour référence ...

[Route("api/[controller]")]
public class ValuesController : Controller
{
    // GET api/values
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    [HttpGet("{id}")]
    public string Get(int id)
    {
        return "value";
    }

    // POST api/values
    [HttpPost]
    public void Post([FromBody]string value)
    {
    }

    // PUT api/values/5
    [HttpPut("{id}")]
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE api/values/5
    [HttpDelete("{id}")]
    public void Delete(int id)
    {
    }
}
15
John Livermore

Je crois que vous avez manqué ces deux lignes sur votre configuration:

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();

    // Enable middleware to serve generated Swagger as a JSON endpoint.
    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyAPI V1");
    });
}

Pour accéder à l'interface utilisateur Swagger, l'URL doit être: http: // localhost: XXXX/swagger/

Le JSON peut être trouvé au sommet de l'interface utilisateur Swagger:

 enter image description here

17
TiagoBrenck
#if DEBUG
   // For Debug in Kestrel
   c.SwaggerEndpoint("/swagger/v1/swagger.json", "Web API V1");
#else
   // To deploy on IIS
   c.SwaggerEndpoint("/webapi/swagger/v1/swagger.json", "Web API V1");
#endif

Lorsqu'il est déployé sur IIS, Webapi (URL de base) correspond à l'alias d'application. Vous devez conserver l’alias d’application (URL de base) pour tous les déploiements IIS, car swagger recherche swagger.json à l’emplacement "/swagger/v1/swagger.json", mais ne préfixe pas l’alias d’application (URL de base) raison cela ne fonctionnera pas.

Par exemple:

localhost/swagger/v1/swagger.json - Impossible de trouver swagger.json

7

Je courais dans un problème similaire, mais pas exactement le même avec swagger. Espérons que cela aide quelqu'un d'autre.

J'utilisais un titre de document personnalisé et je ne changeais pas le chemin du dossier dans SwaggerEndPoint pour correspondre au titre du document. Si vous laissez le noeud final pointant sur swagger/v1/swagger.json, il ne trouvera pas le fichier json dans l'interface utilisateur swagger.

Exemple:

services.AddSwaggerGen(swagger =>
        {
            swagger.SwaggerDoc("AppAdministration", new Info { Title = "App Administration API", Version = "v1.0" });

        });


 app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("/swagger/AppAdministration/swagger.json", "App Administration");
        });
5
Aaron Herchmer

J'ai eu le même problème. Vérifiez http: // localhost: XXXX/swagger/v1/swagger.json . Si vous rencontrez des erreurs, corrigez-les.

Par exemple, j'avais une route ambiguë dans une classe de contrôleur de base et j'ai eu l'erreur suivante: "Méthode HTTP ambiguë pour l'action. Les actions nécessitent une liaison explicite HttpMethod pour Swagger 2.0.". Si vous utilisez des contrôleurs de base, assurez-vous que vos méthodes publiques utilisent les attributs HttpGet/HttpPost/HttpPut/HttpDelete OR pour éviter les itinéraires ambigus.

Ensuite, j’avais également défini les attributs HttpGet ("route") ET Route ("route") dans la même méthode, ce qui était le dernier problème pour swagger.

3
Marisol Gutiérrez

Si votre application est hébergée sur IIS/IIS Express, procédez comme suit:

c.SwaggerEndpoint("../swagger/v1/swagger.json", "MyAPI V1");
1
Paweł Zieliński

Vous devez vous conformer à 2 règles:

  1. Décorez toutes les actions avec des méthodes HTTP explicites telles que [HttpGet("xxx")], [HttpPost("xxx")] ou ... au lieu de [Route("xxx")].
  2. Décorez les méthodes publiques dans les contrôleurs avec l'attribut [NoAction].

Notez que http: // localhost: XXXX/swagger/ demandes de page pour http: // localhost: XXXX/swagger/v1/swagger.json fichier, mais une exception se produira de Swagger si vous ne le souhaitez pas. 'ne pas se conformer aux règles ci-dessus.

1
Mohammad Barbast

Personnellement, j’ai eu le même problème et quand j’ai réessayé aujourd’hui au bout d’un moment, j’ai trouvé dans la nouvelle version (2.5.0) qu’en entrant dans le json je pouvais voir une explication de l’erreur qui était dans ici .

Une autre chose qui m'a aidé à le résoudre a été de supprimer les informations d'hébergement connectées au site Web qui se trouvent dans "..vs\config\applicationhost.config" à la racine du dossier de la solution.

J'ai supprimé l'élément qui configurait le site Web.

           <site name="**" id="9">
              <application path="/" applicationPool=""></application>
              <bindings></bindings>
           </site>
1
Alberto

Je suis tombé sur le même problème et j'ai constaté que mon API n'était pas hébergée dans le dossier racine ni dans un répertoire virtuel ..__ J'ai déplacé mon API dans le dossier racine dans IIS et j'ai travaillé.

Plus d'infos dans cette réponse

0
DanielV