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

Jeh*_*hof 2 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."
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

{
    "code": 400,
    "request_id": "dfdfddf",
    "messages": [
        "'Url' must not be empty.",
        "'Url' should not be empty."
    ]
}
Run Code Online (Sandbox Code Playgroud)

Kir*_*kin 9

ApiBehaviorOptions类提供的产生的能力ModelState的响应经由其来定制InvalidModelStateResponseFactory属性,它是类型的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)
    });
};
Run Code Online (Sandbox Code Playgroud)

传入ActionContext实例为活动请求提供了两者ModelStateHttpContext属性,其中包含我希望您可能需要的所有内容.我不确定你的request_id价值来自哪里,所以我把它作为你的静态例子.

为了使用此实现,您可以配置ApiBehaviorOptions实例ConfigureServices,如下所示:

serviceCollection.Configure<ApiBehaviorOptions>(apiBehaviorOptions =>
    apiBehaviorOptions.InvalidModelStateResponseFactory = ...
);
Run Code Online (Sandbox Code Playgroud)


Ale*_*bov 5

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

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)
    { }
}
Run Code Online (Sandbox Code Playgroud)

您可以在以下位置注册ConfigureServices

services.AddMvc(options =>
{
    options.Filters.Add(new CustomValidationResponseActionFilter());
});
Run Code Online (Sandbox Code Playgroud)