如何让Web API方法在Swagger多版本中同时显示?
.NET6 Web API: 让同一接口方法显示在多个Swagger分组中
问题背景
在.NET6多版本Web API开发中,通过[ApiExplorerSettings(GroupName)]给控制器方法配置Swagger分组,现有代码:
[ApiExplorerSettings(GroupName = "v1")] public IActionResult MethodA(Guid id) [ApiExplorerSettings(GroupName = "v2")] public IActionResult MethodB(Guid id)
当前Swagger界面可切换v1、v2版本,但MethodB仅在v2分组可见,需要让它同时出现在v1和v2分组里,使用的NuGet包为Swashbuckle.AspNetCore和Unchase.Swashbuckle.AspNetCore.Extensions。
实现方案
要实现同一接口归属多个Swagger分组,需要扩展ApiExplorer的默认行为,具体步骤如下:
1. 自定义ApiDescriptionProvider
创建继承自DefaultApiDescriptionProvider的类,重写CreateApiDescriptions方法,为目标接口生成对应多分组的ApiDescription实例:
public class MultiGroupApiDescriptionProvider : DefaultApiDescriptionProvider { public MultiGroupApiDescriptionProvider(IApiDescriptionProviderOptions options, IModelMetadataProvider modelMetadataProvider) : base(options, modelMetadataProvider) { } public override void CreateApiDescriptions(ActionContext actionContext) { base.CreateApiDescriptions(actionContext); var controllerAction = actionContext.ActionDescriptor as ControllerActionDescriptor; if (controllerAction == null) return; // 针对MethodB添加v1分组支持 if (controllerAction.ActionName.Equals(nameof(YourController.MethodB), StringComparison.OrdinalIgnoreCase)) { var existingDescriptions = Results.Where(d => d.ActionDescriptor.Id == controllerAction.Id).ToList(); foreach (var desc in existingDescriptions) { // 复制原有ApiDescription并修改分组名 var newDesc = new ApiDescription { ActionDescriptor = desc.ActionDescriptor, RelativePath = desc.RelativePath, HttpMethod = desc.HttpMethod, GroupName = "v1", ParameterDescriptions = desc.ParameterDescriptions, ResponseType = desc.ResponseType }; Results.Add(newDesc); } } } }
如果需要更灵活的配置,可以自定义一个支持多分组的属性(比如[MultiApiGroups("v1", "v2")]),然后在方法中读取该属性的分组列表来批量生成ApiDescription,避免硬编码方法名。
2. 注册自定义Provider
在Program.cs中替换默认的IApiDescriptionProvider实现:
builder.Services.TryAddEnumerable( ServiceDescriptor.Transient<IApiDescriptionProvider, MultiGroupApiDescriptionProvider>());
3. 确保Swagger分组配置正常
确认Swagger文档的分组配置已正确添加:
builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "API Version 1", Version = "v1" }); c.SwaggerDoc("v2", new OpenApiInfo { Title = "API Version 2", Version = "v2" }); });
完成以上配置后,MethodB就会同时显示在v1和v2的Swagger分组界面中。
内容的提问来源于stack exchange,提问作者wywy2020
相关产品推荐
相关产品推荐

