首页 > 解决方案 > UseExceptionHandler 无法处理验证错误

问题描述

在 Asp.Net Core 5 中,我使用 UseExceptionHandler 全局处理异常,除非我发送无效对象,否则它工作正常。例如,我为所需的属性“名称”发送了一个值为空的对象,我在客户端收到以下错误,但运行函数没有在调试器中命中。

{"type":"https://tools.ietf.org/html/rfc7231#section-6.5.1" ,"title":"出现一个或多个验证错误。","status":400,"traceId" :"00-2428f0fb9c415843bca2aaef08eda6f6-11ea476efb792849-00","errors":{"Name":["必填字段名称"]}}

(作为管道中的第一个中间件 :)

     app.UseExceptionHandler(a => a.Run(async context =>
                {
//this does not being exceuted for validation errors
                    var exceptionHandlerPathFeature = context.Features.Get<IExceptionHandlerPathFeature>();
                    var exception = exceptionHandlerPathFeature.Error;
    
                    var exceptionManager = a.ApplicationServices.GetRequiredService<IExceptionManager>();
                    await context.Response.WriteAsJsonAsync(exceptionManager.Manage(exception, context));
                }));

标签: c#asp.net-coreexceptionmiddlewarewebapi

解决方案


这可能会对您有所帮助。

services.AddControllers().ConfigureApiBehaviorOptions(options =>
        {
            options.InvalidModelStateResponseFactory = context =>
            {
                var errors = context.ModelState.Keys
                                        .SelectMany(key => context.ModelState[key].Errors.Select(x => $"{key}: {x.ErrorMessage}"))
                                        .ToArray();

                var apiError = new CustomErrorClass() 
                {
                    Message = "Validation Error",
                    Errors = errors 
                };

                var result = new ObjectResult(apiError);
                result.ContentTypes.Add(MediaTypeNames.Application.Json);

                return result;
            };
        });

推荐阅读