【问题标题】:Serve multiple Swagger UIs on different URLs with single C# ASP.NET Core application使用单个 C# ASP.NET Core 应用程序在不同的 URL 上提供多个 Swagger UI
【发布时间】:2023-02-07 16:08:44
【问题描述】:

我需要在单个 C# ASP.NET Core 应用程序上提供多个 swagger UI。这是必需的,因为应用程序 API 由用于 UI 和其他内容的内部“私有”API 和其他应用程序和用户可以访问的“公共”API 组成。

每个 Swagger 端点都应位于其自己的 Swagger UI 页面上,并具有不同的 URL 地址。我可以在Startup.csConfigure方法上使用此代码将现有的 API 规范划分为两个不同的 json 文件和不同路径中的 json 文件:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{ 
    ...

    app.UseSwagger()
    app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("v0.1_public/swagger.json",  "Public API v0.1");
                c.SwaggerEndpoint("v0.1_private/swagger.json", "Private API v0.1");
            });
    ...
}

我通过在Startup.cs中过滤和添加两个Swagger生成器来划分规范:

public void ConfigureServices(IServiceCollection services)
{
     ...
     services.AddSwaggerGen(c =>
        {
            c.DocumentFilter<PublicAPISwaggerFilter>();
            c.SwaggerDoc("v0.1_public", new OpenApiInfo
            {
                Title = "Public API",
                Version = "v0.1"
            });
        });
     services.AddSwaggerGen(c =>
        {
            c.DocumentFilter<PrivateApiSwaggerFilter>();
            c.SwaggerDoc("v0.1_private", new OpenApiInfo
            {
                Title = "Private API",
                Version = "v0.1"
            });
        });
     ...
}

然后在https://localhost:port/swagger 上提供 Swagger UI,并且两个端点都列在下拉菜单中。

当另一个在路由 https://locahost:port/private/swagger 上而另一个在 https://locahost:port/public/swagger 并且每个都只显示上述端点之一时,我如何创建两个 swagger UI?

【问题讨论】:

  • 你解决了吗?我也有同样的问题

标签: c# swagger swashbuckle


【解决方案1】:

您可以将私有和公共控制器放在不同的目录中(即 Controllers/Private 和 Controllers/Public)并使用控制器模型约定

  1. 创建控制器约定
    public sealed class SwaggerConventions : IControllerModelConvention
    {
        public void Apply(ControllerModel controller)
        {
            // private controllers will contain 'private' word in namespace
            bool isPrivate = controller.ControllerType.Namespace != null && controller.ControllerType.Namespace.Contains("Private");
    
            controller.ApiExplorer.GroupName = isPrivate ? "private" : "public;
        }
    }
    
    1. 在 startup/program.cs 中使用约定
        builder.AddControllers(c =>
        {
            c.Conventions.Add(new SwaggerConentions());
        })
    
    1. 配置 swagger 端点
    services.AddSwaggerGen(swagger =>
    {
        swagger.SwaggerDoc("public", new OpenApiInfo { Title = "public API", Version = "v1" });
        swagger.SwaggerDoc("private", new OpenApiInfo { Title = "private API", Version = "v1" });
    
    }
    
    app
    .UseSwagger()
    .UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint($"/swagger/public/swagger.json", "Public API V1");
        c.SwaggerEndpoint($"/swagger/private/swagger.json", "Private API");
    }
    

【讨论】:

    【解决方案2】:

    您需要将私有和公共控制器拆分为单独的应用程序。这样做也有好处,因为您不想将可公开访问的 API 与内部 API 混合使用。这样维护起来会更容易。

    如果它是您之后的特定 URL 约定,则可以由 IIS 或您用来托管应用程序的其他工具处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-27
      • 2019-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      • 2021-04-22
      • 1970-01-01
      相关资源
      最近更新 更多