如何为多版本API的Swagger文档填充BasePath属性?
嘿,看起来你已经把多版本Swagger的基础配置跑通了,现在想优化每个版本的文档结构,用上basePath(准确说,OpenAPI 3.0+里是Server URL)来对应各自的版本路由对吧?这确实能让Swagger文档和实际接口的路由规则更贴合,也更清晰。我来给你一步步拆解怎么实现:
1. 自定义文档过滤器来设置版本专属的Base路径
首先我们需要一个自定义的IDocumentFilter,用来给每个版本的Swagger文档注入对应的基础路径。这个过滤器会替换OpenAPI 3.0+规范里的Servers节点(替代旧版的BasePath):
public class BasePathFilter : IDocumentFilter { private readonly string _baseApiPath; public BasePathFilter(string baseApiPath) { _baseApiPath = baseApiPath; } public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context) { // 给当前Swagger文档设置专属的基础路径 swaggerDoc.Servers = new List<OpenApiServer> { new OpenApiServer { Url = _baseApiPath } }; } }
2. 在Swagger生成配置中绑定版本与Base路径
接下来在配置SwaggerGen的地方,给每个Api版本单独绑定对应的过滤器,确保每个版本的文档都带上正确的路径前缀。以.NET 6+的Program.cs为例:
builder.Services.AddSwaggerGen(c => { // 配置V1版本的Swagger文档 c.SwaggerDoc("v1", new OpenApiInfo { Title = "我的API V1", Version = "v1" }); // 给V1绑定基础路径/api/v1 c.DocumentFilter<BasePathFilter>("/api/v1"); // 配置V2版本的Swagger文档 c.SwaggerDoc("v2", new OpenApiInfo { Title = "我的API V2", Version = "v2" }); // 给V2绑定基础路径/api/v2 c.DocumentFilter<BasePathFilter>("/api/v2"); // 保留你原来的Api版本筛选逻辑(确保每个版本只显示对应接口) c.DocInclusionPredicate((docName, apiDesc) => { if (!apiDesc.TryGetMethodInfo(out MethodInfo methodInfo)) return false; var controllerVersions = methodInfo.DeclaringType? .GetCustomAttributes(true) .OfType<ApiVersionAttribute>() .SelectMany(attr => attr.Versions); return controllerVersions?.Any(v => $"v{v.ToString()}" == docName) ?? false; }); // 其他配置:比如启用注释、Api注解支持等 c.EnableAnnotations(); });
3. 确保控制器路由与Base路径匹配
你的控制器应该已经用了ApiVersion特性,记得路由要和我们设置的Base路径对应上,比如:
[ApiVersion("1.0")] [Route("api/v{version:apiVersion}/[controller]")] [ApiController] public class ProductsController : ControllerBase { // V1版本的接口逻辑 [HttpGet] public IActionResult GetAllV1() => Ok("V1产品列表"); } [ApiVersion("2.0")] [Route("api/v{version:apiVersion}/[controller]")] [ApiController] public class ProductsController : ControllerBase { // V2版本的接口逻辑 [HttpGet] public IActionResult GetAllV2() => Ok("V2产品列表"); }
4. 验证效果
启动项目后打开Swagger UI,切换不同版本就能看到:每个版本的接口请求地址都会自动带上对应的基础路径前缀(比如V1的接口显示为/api/v1/Products),完全符合你想要的效果。
如果是用旧版Swashbuckle(对应OpenAPI 2.0),可以直接在SwaggerDoc的扩展属性里设置BasePath,但更推荐用上面的OpenAPI 3.0+方案,兼容性更好。
内容的提问来源于stack exchange,提问作者pseudobjorn
相关产品推荐
相关产品推荐

