Проверка состояния модели в Web API - PullRequest
1 голос
/ 06 февраля 2020

У меня есть собственный валидатор модели для проверки и возврата настраиваемых сообщений проверки.

public void Validate(Object instance) {
                // Perfom validations and thow exceptions if any
                   throw new ValidationException();
               }

Теперь я хочу проверить каждый поступающий запрос, используя мой настраиваемый валидатор.
Промежуточное ПО и установщики имеют httpcontext объекта, и я должен прочитать тело запроса, десертилизировать, а затем вызвать мой пользовательский валидатор для выполнения проверок.
Я подавил автоматический запрос по умолчанию c http 400.

Есть ли любой правильный способ вызвать пользовательский валидатор перед каждым запросом к веб-API?

1 Ответ

3 голосов
/ 07 февраля 2020

Когда применяется атрибут [ApiController], ASP. NET Ядро автоматически обрабатывает ошибки проверки модели, возвращая неверный запрос 400 с ModelState в качестве тела ответа:

Automati c HTTP 400 ответов

Чтобы отключить автоматическое поведение c 400, установите для свойства SuppressModelStateInvalidFilter значение true:

services.AddControllers()
    .ConfigureApiBehaviorOptions(options => 
    {   
        options.SuppressModelStateInvalidFilter = true;     
    });

Затем вы можете создать глобальный фильтр действий для проверки ModelState.IsValid и добавьте свою пользовательскую проверку модели, что-то вроде:

public class CustomModelValidate : ActionFilterAttribute {
    public override void OnActionExecuting(ActionExecutingContext context) {
        if (!context.ModelState.IsValid) {
            context.Result = new BadRequestObjectResult(context.ModelState);
        }
    }
}

И зарегистрируйте ее глобально, чтобы применить фильтр к каждому запросу.

...