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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 03:48:43