You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 01:09:29