如何修复 .net core 2.2 应用程序中未找到的 swagger.json

Posted

技术标签:

【中文标题】如何修复 .net core 2.2 应用程序中未找到的 swagger.json【英文标题】:How to fix swagger.json not found in .net core 2.2 app 【发布时间】:2019-06-21 18:10:28 【问题描述】:

我正在 IIS 服务器上部署我的 .net 核心应用程序,并在 swagger UI 中遇到未找到 swagger.json 的问题。当我在本地(开发环境)运行它时,一切正常,但是当我将它部署在 IIS 服务器上时,它找不到 swagger.json 文件。

以前我在 .net core 2.1 应用程序中遇到过这个问题,我通过编写下面的代码来获取虚拟基本路径来解决它。

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

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

我尝试了下面的代码来解决它:

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

但是上面的代码不起作用,因为它返回的是实际的物理路径而不是虚拟路径。

上述代码的输出:C:/inetpub/wwwroot/myapp/swagger/v1/swagger.json 预期输出:http://myserver/MySite/swagger/v1/swagger.json

有谁知道如何在 .net core 2.2 中获取虚拟路径,因为Environment.GetEnvironmentVariable("ASPNETCORE_APPL_PATH"); 不起作用。任何线索都会有所帮助。

【问题讨论】:

根据 Swashbuckle 文档,您应该能够只使用“./swagger/v1/swagger.json”而不是预先添加托管 URL。那没有用吗?编辑为在路径前面添加句点,因为我注意到它没有在域的根目录下运行。 是的,我也尝试过,但没有成功。获取 swagger.json 文件失败。 我有类似的问题,但原因可能不同。如果有人想可以查看我的经验here 【参考方案1】:

我已通过将以下代码放入我的 .net 核心应用程序中解决了我的问题。

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

根据swashbuckle 文档,如果您将其托管在 IIS 中,则需要在前面添加 ./。

我希望这个答案能节省您的时间!

【讨论】:

是的,但我错过了“。”前 ”/”。谢谢! 不幸的是,这不起作用。我有使用 IIS express 托管的应用程序,并将launchsettings.json 设置为"iisExpress": "applicationUrl": "http://localhost/char", 以测试 IIS 虚拟目录。但是问题是 localhost/char/swagger 显示 404 错误但 localhost/char/swagger/v1/swagger.json 有效(显示 json 文件)。如果applicationUrl 值中没有路径,localhost/swagger 工作正常。我正在使用netcore31Swashbuckle.AspNetCore 5.0.0 @VAAA 是的,我做到了。请在此线程中查看my answer 这个解决方案救了我的命!【参考方案2】:

我尝试使用Mahesh's answer 中的c.SwaggerEndpoint("./swagger/v1/swagger.json", "Test.Web.Api");,但问题是它确实有帮助。

我已经使用 IIS Express 从 VS 开始 Swashbuckle sample

我遇到了错误

未能加载 API 定义。未定义的./swagger/v1/swagger.json

何时从 Web 浏览器访问 localhost/char/swagger 端点。

我修改了launchsettings.json\iisExpress\applicationUrl 并添加了类似"iisExpress": "applicationUrl": "http://localhost/char" 的路径 和Startup.cs 之类的源代码

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

解决方案在Github issue找到,请在下面找到:

app.UseSwaggerUI(c =>

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

我没有在文档中看到它,但它正在工作

由 IIS Express 在本地托管,在 iisExpress\applicationUrl 中的主机名之后有(或没有)附加路径 由 IIS 在暂存环境中托管(在主机名之后有附加路径,例如 http://staginghost/char/swagger

【讨论】:

@GabrielSimas 这个解决方案已有两年历史了。尝试发布新的 Swashbuckle.WebApi 问题,您认为它做得正确。【参考方案3】:

对于 .net core 5,swagger 会在项目创建时自动添加。

public void ConfigureServices(IServiceCollection services)

    services.AddSwaggerGen(c =>
    
        c.SwaggerDoc("v1", new OpenApiInfo  Title = "MyProject.Api", Version = "v1" );
    );

但是,您需要确保两个注释行不在 if 块中。

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"));                 

        

【讨论】:

【参考方案4】:

我遇到了这个问题,发现你必须匹配路径中版本的确切类型以及 servicescollection 和 appbuilder

 services.AddSwaggerGen(c => 
    c.SwaggerDoc("v1" , new OpenApiInfo Title = "MyApp API" , Version = "v1" );
 );

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

【讨论】:

【参考方案5】:

在我的情况下,我忘记在我的控制器公共 get 方法之一中添加 HTTPGet 属性

【讨论】:

【参考方案6】:

您可以通过以下方式修复相同的问题:

包:#region Assembly Swashbuckle.AspNetCore.Swagger,版本=4.0.1.0

框架:.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)

    // Enable middleware to serve generated Swagger as a JSON endpoint.
    app.UseSwagger();
    // Enable middleware to serve swagger-ui (html, JS, CSS, etc.), 
    // specifying the Swagger JSON endpoint.
    app.UseSwaggerUI(c =>
    
         c.SwaggerEndpoint("/swagger/v1/swagger.json", "Versioned Api v1");
    );

当您在本地运行应用程序或托管在 IIS 上时,这是可行的。

【讨论】:

【参考方案7】:

对于 .Net Core 2.2

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

然后

 // 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();
        

【讨论】:

虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。

以上是关于如何修复 .net core 2.2 应用程序中未找到的 swagger.json的主要内容,如果未能解决你的问题,请参考以下文章

将项目从 2.2 更新到 3.1(缺少程序集)或如何在 .NET Core 中使用 API POST 请求时,PostAsJsonAsync()在 .Net Core 3.1 中不起作用 [重复]

如何使用 Asp.Net Core 2.2 / IdentityServer4 / SP.NET Core Identity 手动散列密码

在 Asp.Net Core 中使用 Swagger 在请求中未发送授权承载令牌

使用 webpack 在 ASP.NET Core 项目中未定义 jQuery 和 $

.NET Core 2.2 无法在 Visual Studio Build Framework 中选择

如何在asp.net core razor pages 2.2中设置日期格式和文化