如何在启动阶段从管道中移除指定Controller?
完全移除指定Controller的实现方案
要实现启动阶段选择性移除Controller,让其既不在Swagger中展示,访问时返回404,最彻底的方式是从ASP.NET Core的控制器发现机制中排除目标控制器,具体有两种实现方式:
方式一:硬编码指定排除的控制器名称
这种方式适合固定需要排除的控制器,直接在启动时指定类名(带Controller后缀):
- 自定义控制器特性提供器
public class ExcludeControllerFeatureProvider : ControllerFeatureProvider { private readonly List<string> _excludedControllerNames; public ExcludeControllerFeatureProvider(List<string> excludedControllerNames) { _excludedControllerNames = excludedControllerNames; } protected override bool IsController(TypeInfo typeInfo) { // 先确认是符合默认规则的控制器,再排除指定名称的类 if (!base.IsController(typeInfo)) return false; return !_excludedControllerNames.Contains(typeInfo.Name); } }
- 在启动配置中替换默认提供器
在Program.cs(或旧版的Startup.cs)中注册自定义提供器,替换默认的控制器发现逻辑:
builder.Services.AddControllers() .ConfigureApplicationPartManager(apm => { // 移除默认的控制器发现提供器 var defaultProvider = apm.FeatureProviders.OfType<ControllerFeatureProvider>().First(); apm.FeatureProviders.Remove(defaultProvider); // 添加自定义提供器,传入要排除的控制器名称列表 apm.FeatureProviders.Add(new ExcludeControllerFeatureProvider( new List<string> { "TestController", "AdminController" })); });
方式二:通过特性标记动态排除
这种方式更灵活,不需要修改启动代码,只需给要排除的控制器添加特性即可:
- 定义排除特性
[AttributeUsage(AttributeTargets.Class)] public class ExcludeFromApiAttribute : Attribute { }
- 在目标控制器上添加特性
[ExcludeFromApi] public class TestController : ControllerBase { // 控制器逻辑 }
- 修改自定义控制器特性提供器
public class ExcludeControllerFeatureProvider : ControllerFeatureProvider { protected override bool IsController(TypeInfo typeInfo) { if (!base.IsController(typeInfo)) return false; // 排除带有ExcludeFromApiAttribute特性的控制器 return !typeInfo.GetCustomAttributes<ExcludeFromApiAttribute>().Any(); } }
- 同样在启动配置中替换默认提供器
builder.Services.AddControllers() .ConfigureApplicationPartManager(apm => { var defaultProvider = apm.FeatureProviders.OfType<ControllerFeatureProvider>().First(); apm.FeatureProviders.Remove(defaultProvider); apm.FeatureProviders.Add(new ExcludeControllerFeatureProvider()); });
效果说明
通过上述方式实现后:
- 被排除的控制器不会被ASP.NET Core的路由系统注册,客户端访问时直接返回404
- Swagger(如Swashbuckle)是基于控制器发现结果生成文档的,因此这些控制器也不会出现在Swagger界面中
内容的提问来源于stack exchange,提问作者user149691
相关产品推荐
相关产品推荐

