自定义对验证错误的自动响应

时间:2018-07-20 09:41:17

标签: c# validation asp.net-core

使用asp.net core 2.1,当发生验证错误时,ApiController将自动响应400 BadRequest。

如何更改/修改发送回客户端的响应(json-body)?有某种中间件吗?

我正在使用FluentValidation验证发送到控制器的参数,但是我对收到的响应不满意。看起来像

{
    "Url": [
        "'Url' must not be empty.",
        "'Url' should not be empty."
    ]
}

我想更改响应,因为我们有一些附加到响应的默认值。所以我看起来应该像

{
    "code": 400,
    "request_id": "dfdfddf",
    "messages": [
        "'Url' must not be empty.",
        "'Url' should not be empty."
    ]
}

2 个答案:

答案 0 :(得分:8)

ApiBehaviorOptions类提供了通过其InvalidModelStateResponseFactory属性(类型为ModelState)来定制Func<ActionContext, IActionResult>响应的能力。

这是一个示例实现:

apiBehaviorOptions.InvalidModelStateResponseFactory = actionContext => {
    return new BadRequestObjectResult(new {
        Code = 400,
        Request_Id = "dfdfddf",
        Messages = actionContext.ModelState.Values.SelectMany(x => x.Errors)
            .Select(x => x.ErrorMessage)
    });
};

传入的ActionContext实例为活动请求提供ModelStateHttpContext属性,其中包含我期望的所有需求。我不确定您的request_id值来自何处,因此我将其作为静态示例。

要使用此实现,您可以在ApiBehaviorOptions中配置ConfigureServices实例,如下所示:

serviceCollection.Configure<ApiBehaviorOptions>(apiBehaviorOptions =>
    apiBehaviorOptions.InvalidModelStateResponseFactory = ...
);

答案 1 :(得分:0)

考虑创建自定义action filer,例如:

npm uninstall babel-preset-react-native
npm install babel-preset-react-native@2.1.0

您可以在public class CustomValidationResponseActionFilter : IActionFilter { public void OnActionExecuting(ActionExecutingContext context) { if (!context.ModelState.IsValid) { var errors = new List<string>(); foreach (var modelState in context.ModelState.Values) { foreach (var error in modelState.Errors) { errors.Add(error.ErrorMessage); } } var responseObj = new { code = 400, request_id = "dfdfddf", messages = errors }; context.Result = new JsonResult(responseObj) { StatusCode = 400 }; } } public void OnActionExecuted(ActionExecutedContext context) { } } 中注册它:

ConfigureServices