ASP.NET Web API中如何将两个控制器拆分到两个Swagger定义?
问题分析与解决方案
你的问题根源在于以下几点:
DocInclusionPredicate被硬编码返回true,这会强制所有接口都被包含到每一个Swagger文档中MainController的Alive方法错误指定了GroupName = "v1",和你定义的Swagger文档分组名不匹配SchoolController的类名笔误写成了MainController,会导致控制器冲突
修正步骤:
1. 调整Swagger文档的包含规则
修改AddSwaggerGen中的DocInclusionPredicate,让接口仅出现在对应分组的Swagger文档里:
services.AddSwaggerGen(d => { d.SwaggerDoc("main", new OpenApiInfo { Title = "Main", Version = "v1", Description = "The main information", Contact = new OpenApiContact { Name = "itsfinniii" } }); d.SwaggerDoc("school", new OpenApiInfo { Title = "School", Version = "v1", Description = "School stuff", Contact = new OpenApiContact { Name = "itsfinniii" } }); // 关键修正:仅包含接口GroupName与当前文档名匹配的接口 d.DocInclusionPredicate((docName, apiDesc) => { if (!apiDesc.TryGetMethodInfo(out var _)) return false; return string.Equals(apiDesc.GroupName, docName, StringComparison.OrdinalIgnoreCase); }); });
2. 修正MainController的Action分组配置
把Alive方法上的分组名改成和控制器一致的main,或者直接删除该属性(Action会默认继承控制器的分组):
[Route("api")] [Tags("Main Endpoints")] [ApiExplorerSettings(GroupName = "main")] [ApiController] public class MainController : ControllerBase { [HttpGet] [Route("alive")] // 改为匹配控制器的分组名,或直接删除此属性 [ApiExplorerSettings(GroupName = "main")] [ProducesResponseType(StatusCodes.Status204NoContent)] public async Task<IActionResult> Alive() { return new NoContentResult(); } }
3. 修正SchoolController的类名笔误
把类名从MainController改成SchoolController,避免控制器重复:
[Route("api/school")] [Tags("School Endpoints")] [ApiExplorerSettings(GroupName = "school")] [ApiController] // 修正类名 public class SchoolController : ControllerBase { [HttpGet] [Route("hello-world")] [ProducesResponseType(StatusCodes.Status200OK)] public async Task<string> Alive() { return "Hello World!"; } }
完成以上修改后,每个Swagger文档只会展示对应分组的接口和标签:
- 访问
/swagger/main/swagger.json仅显示Main Endpoints标签下的alive接口 - 访问
/swagger/school/swagger.json仅显示School Endpoints标签下的hello-world接口
内容的提问来源于stack exchange,提问作者itsfinniii
相关产品推荐
相关产品推荐

