.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
相关产品推荐
相关产品推荐

