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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 23:43:14