ASP.NET Core Web API数据类型错误时自定义错误消息
自定义ASP.NET Core Web API数据类型错误返回消息
方法一:全局异常过滤器处理Json转换错误
这种方式可以统一处理所有接口的Json数据类型转换错误,无需逐个属性配置。
步骤1:创建自定义异常过滤器
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using System.Text.Json; public class JsonValidationFilter : ExceptionFilterAttribute { public override void OnException(ExceptionContext context) { if (context.Exception is JsonException jsonEx) { // 解析Json路径,提取字段名(如从$.name提取Name) var propertyName = ParsePropertyName(jsonEx.Path); // 自定义错误消息,可根据字段名设置不同提示 var errorMessage = propertyName.Equals("Name", StringComparison.OrdinalIgnoreCase) ? "名称必须为字符串类型" : $"字段{propertyName}的数据类型不正确"; // 构造自定义验证错误响应 var validationProblem = new ValidationProblemDetails { Status = StatusCodes.Status400BadRequest, Title = "请求数据格式错误", Errors = new Dictionary<string, string[]> { { propertyName, new[] { errorMessage } } } }; context.Result = new BadRequestObjectResult(validationProblem); context.ExceptionHandled = true; } } private string ParsePropertyName(string jsonPath) { if (string.IsNullOrWhiteSpace(jsonPath)) return string.Empty; // 处理$.name格式的路径,提取字段名并首字母大写 var parts = jsonPath.Split('.'); var fieldName = parts.Length > 1 ? parts[1] : jsonPath; return char.ToUpper(fieldName[0]) + fieldName[1..]; } }
步骤2:注册过滤器到全局
在Program.cs中添加过滤器配置:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(options => { // 添加自定义Json验证过滤器 options.Filters.Add<JsonValidationFilter>(); }); // ...其他配置 var app = builder.Build(); // ...中间件配置 app.MapControllers(); app.Run();
方法二:针对特定属性使用自定义Json转换器
如果只需要给个别字段做类型校验和自定义提示,可以用这种方式,直接在模型属性上配置转换器。
步骤1:创建自定义字符串转换器
using System.Text.Json; using System.Text.Json.Serialization; public class StrictStringConverter : JsonConverter<string> { public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // 仅接受字符串类型,否则抛出自定义错误 if (reader.TokenType != JsonTokenType.String) { throw new JsonException("名称必须是字符串类型"); } return reader.GetString() ?? string.Empty; } public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) { writer.WriteStringValue(value); } }
步骤2:在模型属性上应用转换器
修改UpdateNameData类:
using System.ComponentModel.DataAnnotations; using System.Text.Json.Serialization; public class UpdateNameData { [Required(ErrorMessage = "名称为必填项")] [JsonConverter(typeof(StrictStringConverter))] public string Name { get; set; } = string.Empty; }
效果验证
发送请求{ "name": 1 }后,会返回自定义错误响应:
{ "title": "请求数据格式错误", "status": 400, "errors": { "Name": [ "名称必须为字符串类型" ] }, "traceId": "..." }
内容的提问来源于stack exchange,提问作者user18003912
相关产品推荐
相关产品推荐

