如何阻止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
相关产品推荐
相关产品推荐

