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

如何在启动阶段从管道中移除指定Controller?

完全移除指定Controller的实现方案

要实现启动阶段选择性移除Controller,让其既不在Swagger中展示,访问时返回404,最彻底的方式是从ASP.NET Core的控制器发现机制中排除目标控制器,具体有两种实现方式:

方式一:硬编码指定排除的控制器名称

这种方式适合固定需要排除的控制器,直接在启动时指定类名(带Controller后缀):

  1. 自定义控制器特性提供器
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);
    }
}
  1. 在启动配置中替换默认提供器
    在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" }));
    });

方式二:通过特性标记动态排除

这种方式更灵活,不需要修改启动代码,只需给要排除的控制器添加特性即可:

  1. 定义排除特性
[AttributeUsage(AttributeTargets.Class)]
public class ExcludeFromApiAttribute : Attribute
{
}
  1. 在目标控制器上添加特性
[ExcludeFromApi]
public class TestController : ControllerBase
{
    // 控制器逻辑
}
  1. 修改自定义控制器特性提供器
public class ExcludeControllerFeatureProvider : ControllerFeatureProvider
{
    protected override bool IsController(TypeInfo typeInfo)
    {
        if (!base.IsController(typeInfo))
            return false;
        
        // 排除带有ExcludeFromApiAttribute特性的控制器
        return !typeInfo.GetCustomAttributes<ExcludeFromApiAttribute>().Any();
    }
}
  1. 同样在启动配置中替换默认提供器
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 19:38:40