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

在Swashbuckle中能否为CustomAsset指定多个程序集?

解决Swashbuckle在.NET Web API 2.2中展示跨版本程序集API端点的问题

我刚好处理过类似的场景,给你几个实用的方案来实现需求:

1. 让Swashbuckle扫描所有版本的API程序集

首先要修改SwaggerConfig.cs里的配置——默认情况下Swashbuckle可能只扫描主程序集,你需要明确指定要包含所有版本的独立程序集:

GlobalConfiguration.Configuration
    .EnableSwagger(c =>
    {
        // 扫描所有相关的API程序集,可以直接指定程序集名称或者用匹配规则
        c.ScanAssemblies(assembly => 
            assembly.GetName().Name.Equals("YourApi.V1") ||
            assembly.GetName().Name.Equals("YourApi.V2") ||
            assembly.GetName().Name.Equals("YourApi.Main") // 保留主程序集的控制器
        );

        // 处理可能的路由冲突(比如不同版本有同名action的情况)
        c.ResolveConflictingActions(apiDescriptions => 
        {
            // 这里可以根据版本前缀筛选,或者直接返回第一个(根据业务需求调整)
            return apiDescriptions.OrderByDescending(d => d.Route.RouteTemplate).First();
        });

        // 如果你有XML注释,记得把所有程序集的注释文件都加进来
        c.IncludeXmlComments($"{AppDomain.CurrentDomain.BaseDirectory}\\bin\\YourApi.V1.xml");
        c.IncludeXmlComments($"{AppDomain.CurrentDomain.BaseDirectory}\\bin\\YourApi.V2.xml");
        c.IncludeXmlComments($"{AppDomain.CurrentDomain.BaseDirectory}\\bin\\YourApi.Main.xml");
    })
    .EnableSwaggerUi(c =>
    {
        // 保持默认配置,所有端点会展示在同一个Swagger文档里
    });

2. (推荐)配置多版本分组展示

如果希望用户能清晰区分不同版本的API,建议配置多版本Swagger文档,这样用户可以在UI顶部切换版本查看对应端点:

GlobalConfiguration.Configuration
    .EnableSwagger(c =>
    {
        // 先扫描所有相关程序集
        c.ScanAssemblies(assembly => 
            assembly.GetName().Name.StartsWith("YourApi.")
        );

        // 配置多版本支持(前提是控制器上标记了ApiVersion属性,需安装Microsoft.AspNet.WebApi.Versioning包)
        c.MultipleApiVersions(
            (apiDesc, targetVersion) => 
            {
                // 检查当前API对应的控制器是否包含目标版本的ApiVersion属性
                var apiVersionAttr = apiDesc.ActionDescriptor.ControllerDescriptor.GetCustomAttributes<ApiVersionAttribute>().FirstOrDefault();
                return apiVersionAttr?.Versions.Any(v => v.ToString() == targetVersion) ?? false;
            },
            versionBuilder =>
            {
                versionBuilder.Version("v2", "API Version 2.0");
                versionBuilder.Version("v1", "API Version 1.0");
            }
        );

        // 处理路由冲突
        c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());

        // 包含所有程序集的XML注释
        // ... 同上面的注释文件引用代码
    })
    .EnableSwaggerUi(c =>
    {
        // 启用版本选择器,用户可在UI中切换不同版本的文档
        c.EnableDiscoveryUrlSelector();
        // 设置默认的模型展开深度,提升阅读体验
        c.DefaultModelExpandDepth(2);
    });

补充:未使用ApiVersion属性的替代方案

如果你的版本区分是靠路由前缀(比如[RoutePrefix("api/v1/users")]),可以修改多版本的判断逻辑:

c.MultipleApiVersions(
    (apiDesc, targetVersion) => 
    {
        // 检查路由模板是否包含目标版本前缀
        return apiDesc.Route.RouteTemplate.StartsWith($"api/{targetVersion}/");
    },
    versionBuilder =>
    {
        versionBuilder.Version("v2", "API Version 2.0");
        versionBuilder.Version("v1", "API Version 1.0");
    }
);

关键注意点

  • 确保所有版本程序集的路由不会完全重复,否则Swashbuckle可能无法正确识别,需要用ResolveConflictingActions来处理。
  • 如果你的独立程序集没有被主Web API程序集引用,要先添加引用,否则Swashbuckle找不到这些程序集。
  • 生成XML注释时,要确保每个版本的项目都开启了*"生成XML文档文件"*的选项(在项目属性->生成面板中设置)。

这样配置后,无论是把所有端点放在同一个文档,还是按版本分组展示,都能满足用户查看跨版本API端点的需求啦!

内容的提问来源于stack exchange,提问作者abraganza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:23:37