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

.NET 6 Web API:如何将JSON请求体验证错误转为统一格式响应

.NET 6 Web API 统一JSON请求体验证错误响应格式

要将JSON请求体的验证错误(包括格式错误、模型验证错误)转换为自定义统一格式,可通过以下步骤实现:

1. 定义统一错误响应模型

首先创建与你标准格式匹配的实体类:

public class CustomErrorResponse
{
    public int StatusCode { get; set; }
    public string Message { get; set; }
    public string ErrorCode { get; set; }
    public string Target { get; set; }
    public string InnerError { get; set; }
}

2. 捕获JSON格式解析错误(无效字符等)

JSON格式错误发生在模型绑定之前,需要通过自定义中间件捕获JsonException:

public class JsonValidationMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<JsonValidationMiddleware> _logger;

    public JsonValidationMiddleware(RequestDelegate next, ILogger<JsonValidationMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (JsonException ex)
        {
            _logger.LogError(ex, "请求体JSON格式无效");
            
            var errorResponse = new CustomErrorResponse
            {
                StatusCode = StatusCodes.Status400BadRequest,
                Message = "请求体JSON格式无效",
                ErrorCode = "INVALID_JSON_FORMAT",
                Target = "JsonValidation",
                InnerError = ex.Message
            };

            context.Response.StatusCode = StatusCodes.Status400BadRequest;
            context.Response.ContentType = "application/json";
            
            await context.Response.WriteAsJsonAsync(errorResponse);
        }
    }
}

3. 替换模型验证错误的默认响应

对于模型属性验证失败的情况,通过配置ApiBehaviorOptions替换默认的错误响应:

builder.Services.Configure<ApiBehaviorOptions>(options =>
{
    options.InvalidModelStateResponseFactory = context =>
    {
        var errorMessages = context.ModelState.Values
            .SelectMany(v => v.Errors)
            .Select(e => e.ErrorMessage);
        var combinedMessage = string.Join("; ", errorMessages);

        var errorResponse = new CustomErrorResponse
        {
            StatusCode = StatusCodes.Status400BadRequest,
            Message = $"字段验证失败:{combinedMessage}",
            ErrorCode = "MODEL_VALIDATION_FAILED",
            Target = "ModelValidation",
            InnerError = combinedMessage
        };

        return new BadRequestObjectResult(errorResponse);
    };
});

4. 注册中间件并配置服务

在Program.cs中注册自定义中间件并应用配置:

var builder = WebApplication.CreateBuilder(args);

// 添加控制器服务
builder.Services.AddControllers();

// 配置模型验证错误响应
builder.Services.Configure<ApiBehaviorOptions>(options =>
{
    options.InvalidModelStateResponseFactory = context =>
    {
        var errorMessages = context.ModelState.Values
            .SelectMany(v => v.Errors)
            .Select(e => e.ErrorMessage);
        var combinedMessage = string.Join("; ", errorMessages);

        var errorResponse = new CustomErrorResponse
        {
            StatusCode = StatusCodes.Status400BadRequest,
            Message = $"字段验证失败:{combinedMessage}",
            ErrorCode = "MODEL_VALIDATION_FAILED",
            Target = "ModelValidation",
            InnerError = combinedMessage
        };

        return new BadRequestObjectResult(errorResponse);
    };
});

var app = builder.Build();

// 注册JSON格式验证中间件(需放在UseControllers之前)
app.UseMiddleware<JsonValidationMiddleware>();

app.UseAuthorization();

app.MapControllers();

app.Run();

这样处理后,无论是JSON格式错误(如含无效字符)还是模型属性验证错误,都会返回你指定的统一格式响应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:40:19