.NET Core Web API 无效JSON类型错误自定义响应格式实现方法问询
解决方案
完全可以实现自定义统一错误格式返回,推荐优先使用官方提供的配置方案,也可以根据需求选择全局中间件方案,具体实现如下:
方案1:配置ApiBehaviorOptions(推荐,性能最优)
该方案直接修改.NET Core默认的模型验证错误处理逻辑,无需拦截整个请求流,同时会覆盖所有模型验证场景的错误返回(包括JSON反序列化类型不匹配、数据注解验证失败等)。
- 先定义你需要的统一返回结构,示例如下:
/// 全局统一API返回结构 public class ApiResponse<T> { /// 自定义响应码,比如200=成功,400=参数错误,500=服务错误 public int Code { get; set; } /// 响应提示信息 public string Message { get; set; } /// 响应数据 public T Data { get; set; } }
- 在服务注册环节修改默认验证行为,.NET 6+版本在
Program.cs中添加如下配置:
builder.Services.Configure<ApiBehaviorOptions>(options => { options.InvalidModelStateResponseFactory = context => { // 收集所有验证错误信息 var errorMessages = context.ModelState.Values .SelectMany(item => item.Errors) .Select(error => error.ErrorMessage); // 构造自定义返回结果 var result = new ApiResponse<object> { Code = 400, Message = $"参数校验失败:{string.Join(";", errorMessages)}", Data = null }; // 返回自定义格式的400响应 return new BadRequestObjectResult(result); }; });
方案2:全局中间件(适合需要统一处理所有类型异常的场景)
如果需要同时处理参数验证错误、业务异常、系统运行时异常等所有错误场景,可以自定义全局中间件统一拦截处理,注意中间件需要注册到请求管道的最开头:
- 自定义全局异常中间件:
public class GlobalErrorHandleMiddleware { private readonly RequestDelegate _next; public GlobalErrorHandleMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { try { await _next(context); // 捕获参数验证返回的400状态码,重写返回格式 if (context.Response.StatusCode == StatusCodes.Status400BadRequest && !context.Response.HasStarted) { context.Response.ContentType = "application/json"; await context.Response.WriteAsJsonAsync(new ApiResponse<object> { Code = 400, Message = "参数校验失败,请检查请求参数格式", Data = null }); } } catch (Exception ex) { // 处理其他运行时异常 context.Response.StatusCode = StatusCodes.Status500InternalServerError; context.Response.ContentType = "application/json"; await context.Response.WriteAsJsonAsync(new ApiResponse<object> { Code = 500, Message = "服务器内部错误,请稍后重试", Data = null }); } } }
- 在
Program.cs中注册中间件,必须放在所有其他中间件注册逻辑之前:
app.UseMiddleware<GlobalErrorHandleMiddleware>();
内容的提问来源于stack exchange,提问作者scottdavidwalker
相关产品推荐
相关产品推荐

