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

