我有多个 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 直接在每个端点中设置前缀,但我不知道如何/是否可能。

最佳答案

我最终使用 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";
    }
}

关于c# - 如何自定义 Swagger 端点 url?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55711518/

10-16 03:38