我在 .NET 核心网站/控制器上使用 GraphQL。架构非常大,因此构造函数需要大约一秒钟的时间才能运行。我不能在每个请求上都有这种开销,所以我将模式创建为一个单例,在所有请求之间共享。
public async Task<IActionResult> Post([FromBody] GraphQLQuery query)
{
var executionOptions = new ExecutionOptions {
Schema = this.Schema, // dependency injected singleton
/* ... */
};
// ...
executionOptions.FieldMiddleware.Use(next => context =>
{
return next(context).ContinueWith(x=> {
var result = x.Result;
return doStuff(result);
});
});
var result = await new DocumentExecuter().ExecuteAsync(executionOptions).ConfigureAwait(false);
// ...
}
这在大多数情况下都有效,但它会导致中间件出现随机问题。有时中间件会开始为每个元素运行两次,这通常会在中间件第二次运行时导致错误。