Подписка на Subscription GraphQL с клиента на C#

Имеется сервер на Python написанный с использование GraphQ на котором реализована система оповещения пользователей об изменениях:

class Query():pass
class Mutation():pass
class Subscription(event.Subscription):pass

app = Starlette()
app.mount('/graphql', GraphQLApp(
    schema=Schema(
        query=Query,
        mutation=Mutation,
        subscription=Subscription,
    ),
))

class EventModel(Document):
    meta = {
        'collection': 'event',
        'max_documents': 1000,
        'ordering': ['+timestamp'],
        'allow_inheritance': True,
    }

    link = fields.StringField(required=True)
    topic = fields.StringField(required=True)
    source = fields.StringField(required=True)
    timestamp = fields.LongField(required=True)

class EventObject(MObjectType):
    class Meta:
        model = EventModel
        exclude_fields = ['id', '_cls', 'source', 'timestamp']

    timestamp = graphene.String()

    async def resolve_timestamp(self, info):
        return str(self.timestamp)

class Subscription(ObjectType):
    event = graphene.Field(EventObject,
                           topic=Argument(graphene.String, default_value=""),
                           cursor=Argument(graphene.String, default_value="0", description="Unix timestamp in milliseconds"))

    @staticmethod
    async def subscribe_event(_, info, topic, cursor):
        while True:
        # TODO: parse topic and choose the right operator
        source = str(info.context.user.pk)
        cursor = int(cursor)

        for event in EventModel.objects(
                topic__icontains=topic,
                source__ne=source or "",
                timestamp__gt=cursor):
            cursor = event.timestamp
            yield event

        async with condition: await condition.wait()

И имеется клиент на С# на котором необходимо подписаться:

public class SubscriptionManager: IDisposable,
{
    #region Constructors
    public SubscriptionManager() 
    {
        _serverAddress = string.Format(StringResource.FullAddress, ConnectionSettings.Default.Address, ConnectionSettings.Default.Port);
        SubscribeToEvents();
    }
    #endregion

    #region Subscribe to events from the server
    private void SubscribeToEvents()
    {
        var options = new GraphQLHttpClientOptions()
        {
            UseWebSocketForQueriesAndMutations = true,
            EndPoint = new Uri(_serverAddress),
        };

        var graphQLClient = new GraphQLHttpClient(options, new NewtonsoftJsonSerializer());
        
        string qvery = new SubscriptionQueryBuilder().WithEvent(new EventObjectQueryBuilder().WithAllFields(), "", "0").Build();

        GraphQLHttpRequest request = new GraphQLHttpRequest(qvery);

        var _observable = graphQLClient.CreateSubscriptionStream<Subscription>(request);
        _subscription = _observable.Subscribe(NotificationEvent);
    }
    private void NotificationEvent(GraphQLResponse<Subscription> response)
    {
        NotifyObservers(response.Data.Event);
    }
    #endregion

    #region Fields
    private string _serverAddress;
    private IDisposable _subscription;
    #endregion

    #region IDisposable
    public void Dispose()
    {
        _subscription.Dispose();
    }
    #endregion
  }
}

Класс клиента на С# написан по официальной документации, но наладить связь и получить оповещения об изменения на сервере не получается. Подскажите в чем может быть проблема.


Ответы (1 шт):

Автор решения: GooK

Ошибка заключалась в неверно сгенерированной схеме. Одно из полей отличалось по типу, что и нарушало механизм подписка.

→ Ссылка