在我正在构建的 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
到目前为止,一切都很好。我想简化 Swagger UI 中的 display ,所以我想如果我使用 swagger
Servers
属性,我可以简化端点以具有如下格式:
/v1.0/Test
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
我还修改了控制器以使用它作为路线:
[Route("v{version:apiVersion}/[controller]")]
这使得 Swagger UI 显示如我所愿:
但是当我尝试时,我收到 404 错误,即使“路径”对我来说看起来没问题:
/api/public/v1.0/Test
我错过了什么?
为了使其正常工作,您还需要注意文档中的路径 - 您必须根据您设置服务器路径的方式相应地调整它们。
我已经实施了
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>();
});