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

如何阻止HotChocolate将单个值转为单元素数组并强制严格校验?

解决HotChocolate v13自动将单个字符串转为数组的严格校验问题

我在.NET 6 API中使用HotChocolate v13时遇到了默认行为问题。定义的查询变量类型如下:

public class AssetQueryType : InputObjectType<AssetQuery>
{
    public const string AssetQueryTypeName = "AssetQueryType";
    protected override void Configure(
        IInputObjectTypeDescriptor<AssetQuery> descriptor)
    {
        descriptor.Name(AssetQueryTypeName);
        descriptor.Field(x => x.Markets).Type<ListType<StringType>>();
        descriptor.Field(x => x.Locations).Type<ListType<StringType>>();
        descriptor.Field(x => x.Assets).Type<ListType<StringType>>();
        descriptor.Field(x => x.Categories).Type<ListType<StringType>>();
        descriptor.Field(x => x.Page).Type<NonNullType<IntType>>();
        descriptor.Field(x => x.ItemsPerPage).Type<NonNullType<IntType>>();
        descriptor.Field(x => x.Rules).Type<AssetRuleType>();
    }
}

当发送如下查询变量时:

{
  "query": {
    "page": 1,
    "itemsPerPage": 100,  
    "markets": "UK",
    "locations": ["12A", "30F"] 
  }
}

未收到BadRequest错误,传入的markets单个字符串被自动解析为单元素数组。已开启严格验证,需要强制实现正确的查询校验,拒绝单个字符串作为数组类型的输入。

解决方案

HotChocolate默认允许将单个值隐式转换为单元素数组,要禁用这个行为,需要在配置GraphQL服务时关闭值的隐式列表转换,同时确保严格验证已正确启用。

步骤1:配置GraphQL服务时禁用隐式列表转换

在Program.cs中配置AddGraphQL时,添加ConfigureValidation选项,关闭AllowImplicitListConversion:

builder.Services.AddGraphQLServer()
    // 其他配置(比如添加类型、查询等)
    .ConfigureValidation(options =>
    {
        // 禁用单个值到数组的隐式转换
        options.AllowImplicitListConversion = false;
        // 确保严格验证已开启(如果之前没设置)
        options.ValidationStrictness = ValidationStrictness.Strict;
    });

步骤2:验证配置生效

重新启动API后,再发送包含单个字符串作为数组字段的请求时,HotChocolate会返回验证错误,提示markets字段期望数组类型,但收到了字符串类型,符合预期的BadRequest行为。

补充说明

如果需要针对特定字段单独控制这个行为,也可以在字段配置中使用自定义验证规则,但全局禁用隐式列表转换是最直接的解决方案,确保所有数组类型的输入都必须严格传入数组格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:15:12