ASP.NET Core MVC中ActionExecutingContext的ActionArguments始终为空的原因
问题原因及解决办法
1. 异步过滤器方法写法错误
你在LoggedInAttribute里用了async override void OnActionExecuting,这是ASP.NET Core过滤器的错误用法。OnActionExecuting是同步生命周期方法,不能标记为async void——异步逻辑要改用OnActionExecutionAsync方法。用async void会导致框架无法正确等待异步操作,可能参数绑定还没完成,过滤器就提前读取了ActionArguments,结果自然为空。
正确写法:
public class LoggedInAttribute : ActionFilterAttribute { public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { // 这里可以正常读取ActionArguments var argCount = context.ActionArguments.Keys.Count; await next(); } }
2. 参数绑定规则不匹配
你的ChangeBio方法参数是string UserId和string Bio,ASP.NET Core默认会把这类简单类型参数从URL查询串绑定。如果你的请求是把参数放在请求Body里(比如JSON格式),但没给参数加[FromBody]标记,就会绑定失败,导致ActionArguments为空。
解决办法分两种情况:
- 若参数通过Body传递:把UserId和Bio封装成DTO类,再加
[FromBody]标记(注意一个Action只能有一个[FromBody]参数):
public class BioUpdateRequest { public string UserId { get; set; } public string Bio { get; set; } } [ServiceFilter(typeof(LoggedInAttribute))] [HttpPut("bio")] public ActionResult<string> ChangeBio([FromBody] BioUpdateRequest request) { // 使用request.UserId和request.Bio }
- 若参数通过URL查询串传递:确保请求URL是
/bio?UserId=xxx&Bio=xxx,此时无需额外标记,框架会自动完成绑定。
3. 过滤器注册问题(概率较低)
用ServiceFilter时,要确保LoggedInAttribute已经在DI容器中注册,比如在Program.cs里加builder.Services.AddScoped<LoggedInAttribute>()。不过你提到有其他场景能识别参数,这个可能性不大,但可以核对一下。
内容的提问来源于stack exchange,提问作者Enormax
相关产品推荐
相关产品推荐

