在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
相关产品推荐
相关产品推荐

