Подписка на 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
→ Ссылка
Ошибка заключалась в неверно сгенерированной схеме. Одно из полей отличалось по типу, что и нарушало механизм подписка.