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

