5
votes

Comment réparer swagger.json introuvable dans l'application .net core 2.2

Je déploie mon application principale .net sur le serveur IIS et je suis confronté au problème dans l'interface utilisateur swagger où swagger.json est introuvable. Lorsque je l'exécute localement (environnement de développement), tout fonctionne parfaitement, mais lorsque je le déploie sur le serveur IIS, il ne parvient pas à trouver le fichier swagger.json.

Auparavant, j'étais confronté à ce problème dans l'application .net core 2.1 et je l'ai résolu en écrire ci-dessous le code pour obtenir le chemin de base virtuel.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
 {
   app.UseSwaggerUI(c =>
     {
      c.SwaggerEndpoint($"{env.ContentRootPath}swagger/v1/swagger.json", "Test.Web.Api");
       //OR
      c.SwaggerEndpoint($"{env.WebRootPath}swagger/v1/swagger.json", "Test.Web.Api");
      c.RoutePrefix = "";
     });
 }

J'ai essayé le code ci-dessous pour le résoudre:

string basePath = Environment.GetEnvironmentVariable("ASPNETCORE_APPL_PATH");
            basePath = basePath == null ? "/" : (basePath.EndsWith("/") ? basePath : $"{basePath}/");

 app.UseSwaggerUI(c =>
     {
      c.SwaggerEndpoint($"{basePath}swagger/v1/swagger.json", "Test.Web.Api");
      c.RoutePrefix = "";
     });

Mais Le code abouve n'a pas fonctionné car il renvoie le chemin physique réel et non le chemin virtuel.

Est-ce que quelqu'un sait comment obtenir le chemin virtuel dans .net core 2.2 comme Environment.GetEnvironmentVariable ("ASPNETCORE_APPL_PATH"); ne fonctionne pas. N'importe quel prospect serait utile.


3 commentaires

Selon la documentation de Swashbuckle, vous devriez pouvoir utiliser simplement "./swagger/v1/swagger.json" et ne pas ajouter l'URL d'hébergement. Cela n'a-t-il pas fonctionné? Modifié pour ajouter un point à l'avant du chemin car j'ai remarqué que cela ne fonctionnait pas à la racine du domaine.


Oui, j'ai essayé cela aussi mais je n'ai pas fonctionné. Échec de la récupération du fichier swagger.json.


J'ai eu un problème similaire mais la raison peut être différente. si quelqu'un le souhaite, je peux consulter mon expérience ici


5 Réponses :


11
votes

J'ai résolu mon problème en insérant le code ci-dessous dans mon application principale .net.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
 {
   app.UseSwaggerUI(c =>
     {
      c.SwaggerEndpoint("./swagger/v1/swagger.json", "Test.Web.Api");
      c.RoutePrefix = string.Empty;
    });
 }

Selon swashbuckle documentation vous devez ajouter le ./ si vous l'hébergez dans IIS.

J'espère que cette réponse vous fera gagner du temps!


3 commentaires

Ouais, mais j'ai raté "." avant "/". Merci!


Malheureusement ça ne fonctionne pas. J'ai une application hébergée à l'aide d'IIS express et j'avais défini launchsettings.json comme "iisExpress": {"applicationUrl": "http: // localhost / char", pour tester IIS répertoire virtuel. Cependant, le problème est que localhost / char / swagger affiche une erreur 404 mais localhost / char / swagger / v1 / swagger.json fonctionne (le fichier json est affiché). localhost / swagger fonctionne bien s'il n'y a pas de chemin dans la valeur applicationUrl . J'utilise les packages netcore31 et Swashbuckle.AspNetCore 5.0.0


@VAAA oui je l'ai fait. Veuillez consulter ma réponse dans ce fil.



0
votes

Vous pouvez corriger la même chose de la manière suivante:

Package: #region Assembly Swashbuckle.AspNetCore.Swagger, Version = 4.0.1.0

Framework: .Net Core 2.2

< pre> XXX

Cela fonctionne lorsque vous exécutez l'application localement ou hébergée sur IIS.


0 commentaires

2
votes

J'ai essayé d'utiliser c.SwaggerEndpoint ("./ swagger / v1 / swagger.json", "Test.Web.Api"); depuis le La réponse de Mahesh mais le problème est que cela aide.

J'ai Exemple de Swashbuckle démarré à partir de VS à l'aide d'IIS Express p >

J'obtiens une erreur

Échec du chargement de la définition d'API. undefined ./swagger/v1/swagger.json

lors de l'accès au point de terminaison localhost / char / swagger depuis le navigateur Web.

J'avais modifié launchsettings.json \ iisExpress \ applicationUrl et a ajouté le chemin comme "iisExpress": {"applicationUrl": "http: // localhost / char" et Startup.cs code source comme

app.UseSwaggerUI(c =>
{
    string swaggerJsonBasePath = string.IsNullOrWhiteSpace(c.RoutePrefix) ? "." : "..";
    c.SwaggerEndpoint($"{swaggerJsonBasePath}/swagger/v1/swagger.json", "My API");
});

La solution a été trouvée sur Problème Github veuillez le trouver ci-dessous:

   app.UseSwaggerUI(c =>
     {
      c.SwaggerEndpoint("./swagger/v1/swagger.json", "Test.Web.Api");
      c.RoutePrefix = string.Empty;
    });

Je ne l'ai pas vu dans le documentation mais cela fonctionne quand

  • hébergé localement par IIS Express avec (ou sans) chemin supplémentaire après le nom d'hôte dans iisExpress \ applicationUrl
  • hébergé par IIS sur l'environnement de préparation (avec un chemin supplémentaire après le nom d'hôte comme http://staginghost/char/swagger


1 commentaires

@GabrielSimas cette solution a deux ans. Essayez de publier un nouveau problème Swashbuckle.WebApi si vous pensez qu'il l'a fait correctement.



0
votes

Pour .Net Core 2.2

 // 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();
            app.UseOpenApi();
            app.UseSwaggerUi3();

        }
        else
        {
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }

puis

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


1 commentaires

Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant la raison et / ou la manière dont ce code répond à la question améliore sa valeur à long terme.



0
votes

Pour .net core 5, swagger est ajouté automatiquement lors de la création du projet.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider svp)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                //app.UseSwagger();
                //app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyProject.Api v1"));
            }

            app.UseSwagger();
            app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyProject.Api v1"));                 

        }

Cependant, vous devez vous assurer que deux lignes commentées sont en dehors du bloc if.

public void ConfigureServices(IServiceCollection services)
{
    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo { Title = "MyProject.Api", Version = "v1" });
    });
}


0 commentaires