如何自定义Swagger端点url?

问题描述 投票:2回答:1

我有多个web api项目(微服务),我想只使用一个swagger-ui链接来公开它们。为了这篇文章,我将调用每个web api项目EndpointA和EndpointB。

我创建了一个swagger-ui项目,并且我已将每个端点添加到此项目中。

我的swagger-ui项目Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseSwaggerUI(c => {
        c.SwaggerEndpoint("/EndpointA/swagger/v1/swagger.json", "EndpointA");
        c.SwaggerEndpoint("/EndpointB/swagger/v1/swagger.json", "EndpointB");
    });
}

我的终点A / B Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new Info
        {
            Version = "v1",
            Title = "EndpointA", // or "EndpointB",
        });
    });
}

我的问题是每个swagger.json文件都不包含端点前缀。而不是/EndpointA/Controller/Action,路径是/Controller/Action,这是无效的。


我试图在我的swagger ui项目中设置一个自定义url前缀,就像这个c.RoutePrefix = "EndpointA";。它适用于我的EndpointA,但我只能为所有端点设置一个,因此EndpointB不起作用。

我还尝试使用SwaggerGen直接在每个端点设置前缀,但我不知道如何/是否可能。

c# asp.net-core swagger swagger-ui swashbuckle
1个回答
2
投票

我最终使用UsePathBaseExtensions.UsePathBase(IApplicationBuilder, PathString) Method来注册我的api的基本路径。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UsePathBase(new PathString("/EndpointA"));
    app.UseMvc();
}

另一种解决方案是使用swagger基本路径文档过滤器,如下所示:

public void ConfigureServices(IServiceCollection services)
{
     services.AddSwaggerGen(c =>
     {
         c.DocumentFilter<BasePathFilter>();
     });
 }

和过滤器:

public class BasePathFilter: IDocumentFilter
{
    public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
    {
        swaggerDoc.BasePath = "/EndpointA";
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.