How to perform async ModelState validation with FluentValidation in Web API?
我设置了一个Web api项目以使用FluentValidation的webapi集成包来使用FluentValidation。然后,我创建了一个验证器,该验证器使用
问题在于,等待数据库任务时验证似乎陷入僵局。我进行了一些调查,看来MVC ModelState API是同步的,并且它调用了同步的
假设异步调用无法与webapi集成验证一起使用是否正确?
如果是这种情况,还有什么选择? WebApi ActionFilters似乎支持异步处理。我是否需要构建自己的过滤器以手动处理验证,还是已经存在我没有看到的东西?
我最终创建了一个自定义过滤器,并完全跳过了内置验证:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | public class WebApiValidationAttribute : ActionFilterAttribute { public WebApiValidationAttribute(IValidatorFactory factory) { _factory = factory; } IValidatorFactory _factory; public override async Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken) { if (actionContext.ActionArguments.Count > 0) { var allErrors = new Dictionary<string, object>(); foreach (var arg in actionContext.ActionArguments) { // skip null values if (arg.Value == null) continue; var validator = _factory.GetValidator(arg.Value.GetType()); // skip objects with no validators if (validator == null) continue; // validate var result = await validator.ValidateAsync(arg.Value); // if there are errors, copy to the response dictonary if (!result.IsValid) { var dict = new Dictionary<string, string>(); foreach (var e in result.Errors) dict[e.PropertyName] = e.ErrorMessage; allErrors.Add(arg.Key, dict); } } // if any errors were found, set the response if (allErrors.Count > 0) { actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, allErrors); actionContext.Response.ReasonPhrase ="Validation Error"; } } } } |