FluentValidation валидатор не возвращает BadRequest автоматически
Я хочу внедрить валидацию на основе FluentValidation в мой Web API. Проблема в том, что когда, казалось бы, валидатор должен отсекать невалидные запросы возвращая статус код 400 (Bad Request) и также в теле ответа укзаывать список ошибок которые были допущены отправителем при формировании запроса, он их почему-то пропускает дальше на обработку контроллером.
При этом всём ModelState.IsValid успешно устанавливается в true когда ошибок в запросе нету и в false когда они есть соответственно.
Я даже написал unit тест чтобы проверить, работает ли валидатор исправно если проводить валидацию вручную - работает...
Вот как я его внедряю в проект в Startup.cs:
services.AddControllers()
.AddFluentValidation(s =>
{
s.RegisterValidatorsFromAssemblyContaining<UserRegistrationRequestValidator>();
s.RunDefaultMvcValidationAfterFluentValidationExecutes = false;
});
Код самого валидатора:
public class UserRegistrationRequestValidator : AbstractValidator<RegisterUserRequest>
{
/// <summary>
/// Initializes a new instance of the <see cref="UserRegistrationRequestValidator"/> class.
/// </summary>
public UserRegistrationRequestValidator()
{
RuleFor(r => r.Email)
.Matches("^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$")
.WithMessage(RegistrationRequestValidatorMessages.WrongEmailFormat);
RuleFor(r => r.Password)
.Matches("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$")
.WithMessage(RegistrationRequestValidatorMessages.PasswordFormatNotValid);
RuleFor(r => r.FirstName)
.Matches("^[A-Za-z]{2,15}$")
.WithMessage(RegistrationRequestValidatorMessages.FirstNameWrongFormat);
RuleFor(r => r.LastName)
.Matches("^[A-Za-z]{2,15}$")
.WithMessage(RegistrationRequestValidatorMessages.LastNameWrongFormat);
}
}
И модель для которой он должен проводить валидацию:
public class RegisterUserRequest
{
/// <summary>
/// Gets or sets user's e-mail.
/// </summary>
public string Email { get; set; }
/// <summary>
/// Gets or sets provided password.
/// </summary>
public string Password { get; set; }
/// <summary>
/// Gets or sets user's first name.
/// </summary>
public string FirstName { get; set; }
/// <summary>
/// Gets or sets user's last name.
/// </summary>
public string LastName { get; set; }
}
Все эти классы находятся в одном проекте. Помогите, пожалуйста...
АПДЕЙТ
Как выяснилось, запросы не отсекаются только при попытке регистрации нового пользователя. Я использую простейшую авторизацию на Cookie. Причины всё равно пока не известны.
Ответы (1 шт):
Как оказалось, я просто забыл пометить контроллер для аутентификации атрибутами [ApiController] и [Route].