You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core Web API 无效JSON类型错误自定义响应格式实现方法问询

解决方案

完全可以实现自定义统一错误格式返回,推荐优先使用官方提供的配置方案,也可以根据需求选择全局中间件方案,具体实现如下:


方案1:配置ApiBehaviorOptions(推荐,性能最优)

该方案直接修改.NET Core默认的模型验证错误处理逻辑,无需拦截整个请求流,同时会覆盖所有模型验证场景的错误返回(包括JSON反序列化类型不匹配、数据注解验证失败等)。

  1. 先定义你需要的统一返回结构,示例如下:
/// 全局统一API返回结构
public class ApiResponse<T>
{
    /// 自定义响应码,比如200=成功,400=参数错误,500=服务错误
    public int Code { get; set; }
    /// 响应提示信息
    public string Message { get; set; }
    /// 响应数据
    public T Data { get; set; }
}
  1. 在服务注册环节修改默认验证行为,.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:全局中间件(适合需要统一处理所有类型异常的场景)

如果需要同时处理参数验证错误、业务异常、系统运行时异常等所有错误场景,可以自定义全局中间件统一拦截处理,注意中间件需要注册到请求管道的最开头:

  1. 自定义全局异常中间件:
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
            });
        }
    }
}
  1. 在Program.cs中注册中间件,必须放在所有其他中间件注册逻辑之前:
app.UseMiddleware<GlobalErrorHandleMiddleware>();

内容的提问来源于stack exchange,提问作者scottdavidwalker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 06:57:04