.NET 8中FluentValidation验证不生效问题排查
问题描述
我尝试用FluentValidation为接口输入参数做验证,实现了以下逻辑:
验证类与Program.cs不在同一程序集
public class EIdLoginDtoValidator : AbstractValidator<EIdLoginDto> { #region Constructors public EIdLoginDtoValidator() { RuleFor(x => x.EIdToken) .NotNull() .NotEmpty() .WithMessage("Some message"); } #endregion }
随后在Program.cs中注册FluentValidation:
builder.Services.AddFluentValidationAutoValidation(); builder.Services.AddValidatorsFromAssemblyContaining<EIdLoginDtoValidator>();
调试时断点能进入EIdLoginDtoValidator,但即使EIdToken为null,程序仍会执行到接口逻辑。使用的是FluentValidation.AspNetCore 11.2.2版本和.NET 8,请问问题出在哪里?
问题原因与解决方案
这是因为.NET 8里默认修改了自动验证的行为,FluentValidation的自动验证不会主动拦截请求,得手动处理验证结果,或者调整配置让验证失败时自动返回错误。
具体解决办法有两种:
办法一:手动在接口里检查验证结果
在控制器中注入对应的验证器,手动调用验证逻辑,判断结果是否有效,无效则直接返回错误响应:
[ApiController] [Route("api/[controller]")] public class LoginController : ControllerBase { private readonly IValidator<EIdLoginDto> _validator; public LoginController(IValidator<EIdLoginDto> validator) { _validator = validator; } [HttpPost("eid")] public IActionResult EIdLogin(EIdLoginDto dto) { var validationResult = _validator.Validate(dto); if (!validationResult.IsValid) { return BadRequest(validationResult.Errors); } // 执行正常的接口业务逻辑 return Ok(); } }
办法二:配置自动验证拦截请求
如果希望验证失败时自动返回400错误,无需手动编写检查逻辑,需要在注册FluentValidation时修改配置,关闭.NET 8的默认禁用行为,同时确保控制器标记了[ApiController]特性(该特性会自动处理ModelState错误并返回400响应):
builder.Services.AddFluentValidationAutoValidation(options => { // 关闭.NET 8默认的自动验证禁用逻辑,让FluentValidation自动拦截请求 options.DisableDataAnnotationsValidation = true; }); builder.Services.AddValidatorsFromAssemblyContaining<EIdLoginDtoValidator>();
另外提个小优化:验证规则中的NotEmpty()已经包含了NotNull()的检查逻辑,所以可以将规则简化为:
RuleFor(x => x.EIdToken) .NotEmpty() .WithMessage("Some message");
这不是导致验证失效的原因,只是让代码更简洁。
内容的提问来源于stack exchange,提问作者Dragan Milovac
相关产品推荐
相关产品推荐

