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

C# 如何修复.net core 2.2应用程序中找不到的swagger.json,c#,asp.net-core,asp.net-core-2.2,C#,Asp.net Core,Asp.net Core 2.2,我正在IIS服务器上部署我的.net core应用程序,并在未找到swagger.json的swagger UI中面临问题。当我在本地(开发环境)运行它时,一切都正常工作,但当我在IIS服务器上部署它时,它找不到swagger.json文件 以前我在.NETCore2.1应用程序中遇到过这个问题,我通过编写下面的代码来获取虚拟基路径,从而解决了这个问题 string basePath = Environment.GetEnvironmentVariable("ASPNETCORE_APPL_PA

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

以前我在.NETCore2.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 = "";
     });
 }
但abouve代码不起作用,因为它返回的是实际的物理路径而不是虚拟路径

  • 上述代码的输出:C:/inetpub/wwwroot/myapp/swagger/v1/swagger.json
  • 预期产出

有人知道如何在.NETCore2.2中获取虚拟路径作为
Environment.GetEnvironmentVariable(“ASPNETCORE_APPL_path”)不工作。任何潜在客户都会有帮助。

我已经通过在.net核心应用程序中添加以下代码解决了我的问题

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
 {
   app.UseSwaggerUI(c =>
     {
      c.SwaggerEndpoint("./swagger/v1/swagger.json", "Test.Web.Api");
      c.RoutePrefix = string.Empty;
    });
 }
根据文档,如果您在IIS中托管./


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

您可以通过以下方式修复此问题:

包:#区域组件swashback.AspNetCore.Swagger,版本=4.0.1.0

框架:.Net核心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");
    );
}
  // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSwaggerDocument();

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

我尝试使用
c.swagger端点(“./swagger/v1/swagger.json”,“Test.Web.Api”),但问题是它确实有帮助

我已经从VS开始使用IIS Express

我犯了个错误

未能加载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;
    });
解决方案已在中找到,请在下面查找:

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
    • 适用于.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");
          );
      }
      
        // This method gets called by the runtime. Use this method to add services to the container.
          public void ConfigureServices(IServiceCollection services)
          {
              services.AddSwaggerDocument();
      
      然后


      对于.NETCore5,在创建项目时会自动添加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"));                 
      
              }
      

      在我的例子中,我忘记将HTTPGet属性添加到我的controller public get方法中,我遇到了这个问题,发现您必须匹配路径中版本的确切类型以及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"); });
      

      根据Swashback文档,您应该能够只使用“/swagger/v1/swagger.json”并且没有预先添加托管URL。这不起作用吗?编辑为在路径前面添加句点,因为我注意到它没有在域的根目录下运行。是的,我也尝试过,但没有起作用。无法获取swagger.json文件。我有类似的问题,但原因可能不同。如果有人想查看我的体验,可以,但我错过了“/”之前“/”。谢谢!不幸的是,这不起作用。我使用IIS express托管应用程序,并将
      launchsettings.json
      设置为
      “iisExpress”:{“applicationUrl”:”http://localhost/char“,
      测试IIS虚拟目录。但是问题是,
      localhost/char/swagger
      显示404错误,但
      localhost/char/swagger/v1/swagger.json
      工作正常(显示json文件).
      localhost/swagger
      如果
      applicationUrl
      值中没有路径,则可以正常工作。我使用的是
      netcore31
      swashback.AspNetCore 5.0.0
      package@VAAA是的,我有。请检查此线程,而此代码可能会回答问题,提供有关此代码为什么和/或如何回答的其他上下文这个问题提高了它的长期价值。@GabrielSimas这个解决方案已经有两年历史了。试着发布新的Swashback.WebApi,如果你认为它做得很好,就发布它。