.NET Core 3.1集成GraphQL调试时请求不进控制器反而到ObjectGraphType求助
问题排查结论
这个现象不属于错误,是GraphQL.NET中间件的默认设计行为。
原因说明
你在Configure方法中注册了app.UseGraphQL<OrderQuerySchema>()中间件,该中间件会默认拦截发往/graphql端点的所有GraphQL请求,内部自动完成查询解析、参数绑定、执行逻辑,直接调用你定义的Schema对应的Query/ObjectGraphType处理,不需要经过自定义的控制器层。
如果你不需要在控制器层做统一的请求预处理,当前的运行逻辑是完全正常的,中间件处理的性能比自定义控制器更高。
如需让请求进入控制器的调整方案
如果你需要在控制器层做统一权限校验、日志埋点、请求限流等处理,可以按以下步骤调整:
- 移除
Configure方法中的app.UseGraphQL<OrderQuerySchema>()中间件注册 - 新增自定义GraphQL控制器,手动实现查询执行逻辑,示例代码如下:
public class GraphQLQuery { public string Query { get; set; } public JObject Variables { get; set; } } [ApiController] [Route("graphql")] public class GraphQLController : ControllerBase { private readonly ISchema _schema; private readonly IDocumentExecuter _documentExecuter; public GraphQLController(ISchema schema, IDocumentExecuter documentExecuter) { _schema = schema; _documentExecuter = documentExecuter; } [HttpPost] public async Task<IActionResult> Execute([FromBody] GraphQLQuery query) { var executionOptions = new ExecutionOptions { Schema = _schema, Query = query.Query, Variables = query.Variables?.ToInputs() }; var executionResult = await _documentExecuter.ExecuteAsync(executionOptions); if (executionResult.Errors != null && executionResult.Errors.Any()) { return BadRequest(executionResult.Errors); } return Ok(executionResult); } }
- 保持当前
app.UseGraphiQl("/graphql")配置即可,GraphiQL发起的请求会自动匹配到你定义的/graphql控制器路由。
内容的提问来源于stack exchange,提问作者Nguyen Lam
相关产品推荐
相关产品推荐

