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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.09 03:12:34