如何替换 Swagger UI Endpoint 路由中的 Swagger“服务器”路径?

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

在我正在构建的 Web API 中,控制器使用以下约定进行路由:

[Route("api/public/v{version:apiVersion}/[controller]")]
[ApiController]
public class TestController:ControllerBase

[Route("api/v{version:apiVersion}/[controller]")]
[ApiController]
public class InternalController:ControllerBase

这会生成 swagger ui 端点 URL,例如

/api/public/v1.0/Test

Generated swagger UI

到目前为止,一切都很好。我想简化 Swagger UI 中的 display ,所以我想如果我使用 swagger

Servers
属性,我可以简化端点以具有如下格式:
/v1.0/Test

我尝试过的:

尝试#1:
app.UseSwagger(c=>
{
    c.PreSerializeFilters.Add((swaggerDoc, httpReq) =>
    {
        swaggerDoc.Servers = new List<OpenApiServer>
        { 
            new OpenApiServer {
                Url = "/api/public"
            },
            new OpenApiServer {
                Url = "/api"
            }
        };
    });
});

这会在 swagger UI 中添加一个服务器下拉列表,但端点不受影响。 请求被路由至

/api/public/api/public/v1.0/Test

尝试#2:

我还修改了控制器以使用它作为路线:

[Route("v{version:apiVersion}/[controller]")]

这使得 Swagger UI 显示如我所愿:

Generated swagger UI after attempt 2

但是当我尝试时,我收到 404 错误,即使“路径”对我来说看起来没问题:

/api/public/v1.0/Test

我错过了什么?

c# asp.net-web-api swagger swagger-ui swashbuckle
1个回答
0
投票

为了使其正常工作,您还需要注意文档中的路径 - 您必须根据您设置服务器路径的方式相应地调整它们。

我已经实施了

IDocumentFilter
以全面实施:

public class DocumentFilter : IDocumentFilter
{
    const string UnwantedPrefix = "/api/public";

    public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
    {
        var newPaths = new OpenApiPaths();
        foreach (var path in swaggerDoc.Paths)
        {
            newPaths.Add(path.Key.Replace(UnwantedPrefix, string.Empty), path.Value);
        }
        swaggerDoc.Paths = newPaths;


        swaggerDoc.Servers = new List<OpenApiServer>
        {
            new OpenApiServer {
                Url = UnwantedPrefix
            },
        };
    }
}

然后在注册码中使用:

services.AddSwaggerGen(c => 
{
    c.DocumentFilter<DocumentFilter>();
});
© www.soinside.com 2019 - 2024. All rights reserved.