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

.NET GraphQL如何拦截获取Query Schema校验的错误JSON对象

.NET GraphQL后端获取验证错误对象的实现方案

你可以通过以下两种方式拿到字段不存在这类验证错误,满足日志记录、字段合法性校验的需求:

方案一:使用错误过滤器(最常用,适配所有执行/验证阶段错误)

GraphQL.NET 以及主流的 .NET GraphQL 库(如Hot Chocolate)都提供了 IErrorFilter 接口,所有返回给前端的错误都会经过该过滤器的处理,你可以在这里直接拿到完整的错误对象。

实现步骤

  1. 自定义错误过滤器实现 IErrorFilter 接口
using GraphQL;
using GraphQL.Types;
using Microsoft.Extensions.Logging;

public class CustomErrorFilter : IErrorFilter
{
    private readonly ILogger<CustomErrorFilter> _logger;

    public CustomErrorFilter(ILogger<CustomErrorFilter> logger)
    {
        _logger = logger;
    }

    public Error OnError(Error error)
    {
        // 可直接获取错误的所有属性,和返回给前端的JSON字段完全对应
        if (error.Code == "FIELDS_ON_CORRECT_TYPE")
        {
            // 执行日志记录逻辑
            _logger.LogWarning(
                "检测到非法查询字段,错误信息:{Message},错误位置:{Locations},查询路径:{Path}",
                error.Message,
                error.Locations,
                error.Path
            );

            // 也可以自定义修改返回给前端的错误内容
            return error with
            {
                Message = "请求包含不支持的查询字段,请检查参数"
            };
        }

        // 其他类型错误直接返回
        return error;
    }
}
  1. 在服务注册时注入过滤器
// Program.cs 中添加配置
builder.Services.AddGraphQL()
    .AddErrorFilter<CustomErrorFilter>()
    // 保留你原有其他GraphQL配置即可
    ;

方案二:自定义验证规则(提前拦截,在执行查询前校验字段合法性)

如果你需要在查询执行前就校验字段合法性、拦截非法请求,可以自定义查询验证规则,在验证阶段就拿到非法字段的相关信息。

using GraphQL.Validation;
using GraphQLParser.AST;

public class FieldValidityRule : IValidationRule
{
    public ValueTask<INodeVisitor?> ValidateAsync(ValidationContext context)
    {
        var visitor = new NodeVisitors(
            new MatchingNodeVisitor<GraphQLField>((field, ctx) =>
            {
                var parentType = ctx.TypeInfo.GetParentType();
                if (parentType == null) return;
                var fieldName = field.Name.StringValue;
                
                // 校验字段是否在对应类型上存在
                if (parentType.GetField(fieldName) == null)
                {
                    // 此处可直接记录日志、抛出自定义异常
                    ctx.ReportError(new Error(
                        $"字段{fieldName}在类型{parentType.Name}上不存在",
                        field
                    ));
                }
            })
        );
        return new ValueTask<INodeVisitor?>(visitor);
    }
}

注册验证规则:

builder.Services.AddGraphQL()
    .AddValidationRule<FieldValidityRule>()
    ;

补充说明

如果你需要拿到和前端返回完全一致的错误JSON字符串,直接序列化 Error 对象即可,Error 类的所有公开属性和返回JSON的字段一一对应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:24:02