GraphQL .NET: проблемы промежуточного ПО с одноэлементной схемой - PullRequest
1 голос
/ 03 октября 2019

Я использую GraphQL на основном веб-сайте / контроллере .NET. Схема довольно большая, так что для запуска конструктора требуется около секунды. У меня не было такого рода накладных расходов на каждый запрос, поэтому я создал схему как одноэлементную, разделяемую между всеми запросами.

    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);
      // ...
    }

Это работало большую часть времени, но вызывало случайные проблемы спромежуточное программное обеспечение. Иногда промежуточное программное обеспечение запускалось бы дважды для каждого элемента, что обычно приводило к ошибке при втором запуске промежуточного программного обеспечения.

1 Ответ

1 голос
/ 03 октября 2019

Глядя на источник , кажется, что промежуточное ПО применяется к схеме в течение жизненного цикла запроса, а затем, как мне кажется, каким-то образом откатывается в конце? По крайней мере, я предполагаю, что именно так используется элемент public void ApplyTo(ISchema schema), хотя я не уверен, как происходила часть «отката».

Это дало мне представление о том, как решить проблему путемвытащить промежуточное программное обеспечение из представления и поместить его в конструктор схемы, например:

    public class MySchema : Schema
    {
        public MySchema()
        {
            this.Query = new MyQuery();
            this.Mutation = new MyMutation();

            var builder = new FieldMiddlewareBuilder();
            builder.Use(next => context =>
            {
              return  next(context).ContinueWith(x=> {
                var result = x.Result;
                return doStuff(result);
              });
            });
            builder.ApplyTo(this);
        }
    }

Итак, теперь промежуточное программное обеспечение запекается непосредственно в схему, когда создается синглтон, а у контроллера нетсделать что-нибудь.

Это, кажется, полностью решило проблему. Я не уверен, есть ли другие вещи в graphql-dotnet, которые изменяют схему в течение жизненного цикла запроса. Если кто-нибудь знает о каких-либо других проблемах, которые могут возникнуть с одноэлементной схемой, я бы хотел это услышать!

...