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

Swagger为何显示导入项目端点而非主启动项目的端点?

解决Swagger显示引用项目控制器端点的问题

问题核心原因:默认AddControllers()会扫描当前项目及所有引用项目中的控制器类,导致ImporterLayer的控制器被加载并在Swagger中展示。

以下是几种可行的解决方案:

方案1:限定控制器扫描的程序集

修改AddControllers的配置,仅加载当前CustomerLayer项目的控制器程序集:

builder.Services.AddControllers()
    .AddApplicationPart(typeof(Program).Assembly); // 仅添加当前项目程序集

也可以直接指定目标控制器所在的程序集(更明确):

builder.Services.AddControllers()
    .AddApplicationPart(typeof(UserController).Assembly);

方案2:在SwaggerGen中过滤端点

如果需要保留其他项目控制器的加载但仅在Swagger中隐藏,可配置SwaggerGen的筛选规则:

builder.Services.AddSwaggerGen(options =>
{
    options.SwaggerDoc("v1", new OpenApiInfo { Title = typeof(Program).Assembly.GetName().Name, Version = "v1" });
    
    var currentAssembly = typeof(Program).Assembly;
    // 仅包含当前项目程序集内的控制器端点
    options.DocInclusionPredicate((docName, apiDesc) =>
    {
        return apiDesc.ActionDescriptor.RouteValues.TryGetValue("controller", out _)
               && apiDesc.ActionDescriptor.ControllerTypeInfo.Assembly == currentAssembly;
    });
});

补充:修复端点映射缺失问题

原代码中缺少app.MapControllers();,这会导致控制器端点无法被正确映射,需补充到app.UseSwaggerUI()之后、app.Run()之前:

// ... 其他中间件配置 ...

app.MapControllers(); // 映射控制器路由

app.Run();

选择方案1是最彻底的解决方式,它从根源上避免加载引用项目的控制器,确保Swagger仅展示CustomerLayer的端点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:25:07