如何修复.net核心应用中找不到的swagger.json

时间:2019-01-28 17:14:49

标签: c# asp.net-core asp.net-core-2.2

我将.net核心应用程序部署在IIS服务器上,并且在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($"{basePath}swagger/v1/swagger.json", "Test.Web.Api");
      c.RoutePrefix = "";
     });

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

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

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

由于Environment.GetEnvironmentVariable("ASPNETCORE_APPL_PATH");无法正常工作,是否有人知道如何在.net core 2.2中获取虚拟路径。任何线索都会有所帮助。

7 个答案:

答案 0 :(得分:3)

我通过在.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中托管./,则需要在./之前加上前缀。

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

答案 1 :(得分: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"));                 

        }

答案 2 :(得分:2)

我遇到了这个问题,发现您必须匹配路径中版本的确切类型以及 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"); });

答案 3 :(得分:0)

您可以通过以下方式解决此问题:

包装:#region组装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上运行应用程序时,这是可行的。

答案 4 :(得分:0)

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

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

我遇到错误

无法加载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

答案 5 :(得分:0)

对于.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();
        }

答案 6 :(得分:0)

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