【问题标题】:Model State Validation in Web APIWeb API 中的模型状态验证
【发布时间】:2020-05-22 19:43:57
【问题描述】:
我有一个自定义模型验证器来验证并返回自定义验证消息。
public void Validate(Object instance) {
// Perfom validations and thow exceptions if any
throw new ValidationException();
}
现在,我想使用我的自定义验证器来验证每个即将到来的请求。
中间件和 Fitlers 有 httpcontext 对象,我应该读取请求正文,解轨然后调用我的自定义验证器来执行验证。
我已经取消了默认的自动 http 400 响应。
在每个对 Web API 的请求之前,是否有任何适当的方法来调用自定义验证器?
【问题讨论】:
标签:
c#
validation
asp.net-core
asp.net-core-webapi
asp.net-core-middleware
【解决方案1】:
当应用[ApiController] 属性时,ASP.NET Core 通过返回一个 400 Bad Request 并以 ModelState 作为响应正文来自动处理模型验证错误:
Automatic HTTP 400 responses
要禁用自动 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);
}
}
}
并在全局范围内注册以将过滤器应用于每个请求。