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

ASP.NET Core Web Api自定义Async Action Filter验证不生效问题排查

问题原因

ASP.NET Core内置了ModelStateInvalidFilter,这个过滤器的执行优先级高于你自定义的ValidationFilter。当模型验证失败时,它会先触发并返回默认的400错误格式,你的自定义过滤器根本没机会执行逻辑。

解决方法

1. 移除默认的模型验证过滤器

修改Program.cs中的AddControllers配置,先移除默认的ModelStateInvalidFilter,再添加自定义过滤器:

builder.Services.AddControllers(options =>
{
    // 移除默认的模型验证过滤器,避免抢占自定义过滤器的执行时机
    options.Filters.RemoveType<ModelStateInvalidFilter>();
    // 添加自定义验证过滤器
    options.Filters.Add<ValidationFilter>();
})
.AddFluentValidation(configuration => configuration.RegisterValidatorsFromAssemblyContaining<AddressingDtoValidator>());

2. (可选)配置JSON小驼峰序列化

如果需要返回的JSON属性名是小驼峰格式(比如fieldname而非FieldName),可以添加JSON序列化配置:

builder.Services.AddControllers(options =>
{
    options.Filters.RemoveType<ModelStateInvalidFilter>();
    options.Filters.Add<ValidationFilter>();
})
.AddJsonOptions(options =>
{
    // 启用小驼峰命名序列化
    options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
})
.AddFluentValidation(configuration => configuration.RegisterValidatorsFromAssemblyContaining<AddressingDtoValidator>());
验证效果

修改后,当模型验证失败时,你的ValidationFilter会正常执行,返回你定义的ErrorResponse格式:

{
   "errors": [
     {
        "fieldName": "Quarter",
        "message": "'Quarter' must not be empty."
     }
   ]
}

(如果配置了小驼峰,fieldName会变成fieldname)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:18:25