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

