.NET 10 Minimal API含JsonElement时验证管道抛出异常咨询
.NET 10验证管道处理JsonElement时崩溃的问题解答
问题性质确认
这是.NET 10(SDK 10.0.300)中AddValidation()引入的BUG。验证管道会递归遍历模型成员进行验证,当遇到JsonElement类型时,错误地将其索引器(this[])识别为可验证属性,尝试解析时抛出InvalidOperationException,导致请求直接返回500而非预期的400验证错误。该问题已被纳入.NET官方BUG跟踪系统,属于验证框架对特殊值类型的处理缺陷。
官方支持的解决方法
以下几种方式无需修改核心模型设计(保留JsonElement作为不透明JSON载体),即可避免崩溃:
1. 全局跳过JsonElement类型的验证
通过自定义IValidationFilter,让验证管道忽略所有JsonElement类型的成员:
using System.Reflection; using Microsoft.Extensions.Validation; var builder = WebApplication.CreateBuilder(args); builder.Services.AddValidation(options => { options.Filters.Add(new SkipJsonElementValidationFilter()); }); public class SkipJsonElementValidationFilter : IValidationFilter { public bool ShouldValidate(Type type, MemberInfo? memberInfo) { return type != typeof(System.Text.Json.JsonElement); } }
2. 跳过特定DTO的指定成员
如果仅需跳过某个DTO中的特定JsonElement成员(比如示例中的Payload),可针对性过滤:
builder.Services.AddValidation(options => { options.Filters.Add((type, memberInfo) => !(type == typeof(MyRequest) && memberInfo?.Name == nameof(MyRequest.Payload))); });
3. 使用[ValidateNever]特性标记单个成员
直接在DTO的JsonElement成员上添加[ValidateNever]特性,明确告诉验证管道跳过该成员:
using System.ComponentModel.DataAnnotations; using System.Text.Json; public class MyRequest { [Required] [MaxLength(10)] public string Name { get; set; } = default!; [ValidateNever] public JsonElement Payload { get; set; } }
补充说明
上述方法均为.NET验证框架官方提供的扩展能力,可在保留原有模型设计的前提下解决崩溃问题。该BUG预计会在.NET 10后续服务更新或.NET 11版本中修复。
内容的提问来源于stack exchange,提问作者Stephen Montgomery
相关产品推荐
相关产品推荐

