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

如何在ASP.NET Core 5 Web API启动时为指定Action添加[NonAction]特性

在ASP.NET Core 5 Web API启动阶段批量为Action添加特性的实现方案

要在ASP.NET Core 5启动时批量为指定Action添加[NonAction]或[ApiExplorerSettings(IgnoreApi = true)]特性,最优雅的方式是利用**IActionModelConvention**——这是ASP.NET Core提供的扩展点,用于在应用启动阶段修改Action的元数据模型。

实现思路

通过自定义IActionModelConvention实现类,在Action模型构建时匹配目标Action名称并动态添加所需特性,无需手动在每个Action上标注。下面分两种场景给出具体实现:


场景一:基于内存列表的批量处理

如果目标Action名称是固定的内存列表,直接在启动逻辑中传入列表即可:

1. 自定义Action约定类

using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.AspNetCore.Mvc;

public class ApplyNonActionConvention : IActionModelConvention
{
    private readonly List<string> _targetActionNames;

    public ApplyNonActionConvention(List<string> targetActionNames)
    {
        _targetActionNames = targetActionNames;
    }

    public void Apply(ActionModel action)
    {
        // 忽略大小写匹配Action名称
        if (_targetActionNames.Contains(action.ActionName, StringComparer.OrdinalIgnoreCase))
        {
            // 添加[NonAction]特性
            action.Filters.Add(new NonActionAttribute());

            // 如需隐藏API文档,添加ApiExplorerSettings特性(二选一或同时添加)
            // action.Filters.Add(new ApiExplorerSettingsAttribute { IgnoreApi = true });
        }
    }
}

2. 在Startup中注册约定

在ConfigureServices方法中,将自定义约定添加到Mvc选项:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers(options =>
    {
        // 初始化需要处理的Action名称列表
        var actionNames = new List<string>
        {
            "GetLastName",
            "GetName",
            "GetAge"
        };
        
        // 注册自定义约定
        options.Conventions.Add(new ApplyNonActionConvention(actionNames));
    });
}

场景二:基于外部JSON文件的批量处理

如果需要从外部配置文件读取目标Action名称,可通过配置绑定实现:

1. 创建外部配置文件

在项目根目录创建IgnoredActions.json文件:

{
  "IgnoredActions": {
    "TargetActionNames": [
      "GetLastName",
      "GetName",
      "GetAge"
    ]
  }
}

2. 定义配置绑定类

public class IgnoredActionsConfig
{
    public List<string> TargetActionNames { get; set; } = new();
}

3. 加载配置并注册约定

在Startup.cs中加载配置文件,绑定到配置类后传入约定:

public void ConfigureServices(IServiceCollection services)
{
    // 绑定外部JSON配置
    var ignoredActionsConfig = new IgnoredActionsConfig();
    Configuration.Bind("IgnoredActions", ignoredActionsConfig);

    services.AddControllers(options =>
    {
        // 注册约定,传入配置中的Action列表
        options.Conventions.Add(new ApplyNonActionConvention(ignoredActionsConfig.TargetActionNames));
    });

    // 可选:将配置类注册到DI容器,供其他组件使用
    services.Configure<IgnoredActionsConfig>(Configuration.GetSection("IgnoredActions"));
}

4. 确保配置文件被加载

如果使用顶级语句的Program.cs,需添加配置文件加载逻辑:

var builder = WebApplication.CreateBuilder(args);

// 加载外部JSON配置,开启自动重载(可选)
builder.Configuration.AddJsonFile(
    "IgnoredActions.json",
    optional: true,
    reloadOnChange: true
);

注意事项

  • 大小写匹配:示例中使用StringComparer.OrdinalIgnoreCase忽略大小写,可根据业务需求调整匹配规则。
  • 特性选择:[NonAction]会让ASP.NET Core将该方法排除在Action路由之外;[ApiExplorerSettings(IgnoreApi = true)]仅隐藏API文档,方法仍可被路由访问,按需选择。
  • 动态更新:如果需要在运行时修改目标Action列表,需额外实现配置变更监听并重新构建Action模型(启动阶段的约定是一次性生效的,默认不支持动态更新)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:10:52