如何使用FluentValidation替代数据注解验证请求?.NET 5 Web API验证规则失效问题排查
问题根源与解决方案
嘿,这个问题我之前也碰到过!你现在的问题核心是:只注册了FluentValidation的验证器,但没有将它集成到ASP.NET Core的模型验证管道中,所以系统根本不知道要去执行你的验证规则。
修复步骤
1. 调整ConfigureServices的配置
你需要在AddControllers的链式调用中添加AddFluentValidation,把FluentValidation和ASP.NET Core的验证系统关联起来。修改后的代码如下:
public void ConfigureServices(IServiceCollection services) { services.AddControllers() .AddFluentValidation(config => { // 注册程序集中的所有验证器,替代你原来单独的AddValidatorsFromAssemblies调用 config.RegisterValidatorsFromAssemblies(AppDomain.CurrentDomain.GetAssemblies()); // 可选:禁用ASP.NET Core默认的数据注解验证,只使用FluentValidation config.RunDefaultMvcValidationAfterFluentValidationExecutes = false; }); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebApplication", Version = "v1" }); }); }
2. 验证器的确认(你已经做对了,但再核对下)
确保你的RouteModelValidator是public类,并且正确继承了AbstractValidator<RouteModel>——从你提供的代码看这部分没问题,不用改。
3. 关于响应状态码的说明
这里要纠正一个小预期:配置正确后,当Title长度不符合规则时,系统会返回400 Bad Request(客户端错误),而不是500服务器异常。这是符合REST规范的设计,因为参数验证失败是客户端的问题,不是服务器错误。如果确实需要抛出异常,可以通过FluentValidation的自定义配置调整,但默认的400响应更合理。
为什么原来的配置无效?
你之前调用的services.AddValidatorsFromAssemblies只是把验证器实例注册到了依赖注入容器里,但ASP.NET Core的模型验证系统并不知道要去使用这些验证器。AddFluentValidation方法会向ASP.NET Core添加一个自定义的验证提供者,让系统在模型绑定完成后自动触发FluentValidation的规则检查。
内容的提问来源于stack exchange,提问作者Question3r
相关产品推荐
相关产品推荐

