Я пытаюсь реализовать подписку на синхронизацию приложений, аналогичную этому примеру Python, но в .net https://aws.amazon.com/blogs/mobile/appsync-websockets-python/
Я начал это с помощью пакета nuget GraphQL.Client https://www.nuget.org/packages/GraphQL.Client Выполнение Query/Mutation работает нормально, как указано в файле readme https://github.com/graphql-dotnet/graphql-client Но подписка не работает.
Мой код с использованием GraphQL.Client:
using var graphQLClient = new GraphQLHttpClient("https://<MY-API-PATH>.appsync-realtime-api.<AWS-region>.amazonaws.com/graphql", new NewtonsoftJsonSerializer());
graphQLClient.HttpClient.DefaultRequestHeaders.Add("host", "<API HOST without https or absolute path and 'realtime-' text in the api address>"); //As given in the python example
graphQLClient.HttpClient.DefaultRequestHeaders.Add("x-api-key", "<API KEY>");
var req= new GraphQLRequest
{
Query = @"subscription SubscribeToEventComments{ subscribeToEventComments(eventId: 'test'){ content }}",
Variables = new{}
};
IObservable<GraphQLResponse<Response>> subscriptionStream = graphQLClient.CreateSubscriptionStream<Response>(req, (Exception ex) =>
{
Console.WriteLine("Error: {0}", ex.ToString());
});
var subscription = subscriptionStream.Subscribe(response =>
{
Console.WriteLine($"Response'{Newtonsoft.Json.JsonConvert.SerializeObject(response)}' ");
},
ex =>
{
Console.WriteLine("Error{0}", ex.ToString());
});
Это дает исключение «Удаленная сторона закрыла соединение WebSocket, не завершив рукопожатие».
трассировка стека:
в System.Net.WebSockets.ManagedWebSocket.d__662.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter
1.GetResult() в GraphQL.Client.Http.Websocket.GraphQLHttpWebSocket.d__40.MoveNext() в C:\Users\UserName\Source\repos\graphql-client\src\GraphQL. Клиент\Websocket\GraphQLHttpWebSocket.cs:строка 546
Затем я попробовал без этого nuget и с использованием стандартного веб-сокета
Код без nuget:
static public async Task CallWebsocket()
{
try
{
_client = new ClientWebSocket();
_client.Options.AddSubProtocol("graphql-ws");
_client.Options.SetRequestHeader("host", "<HOST URL without wss but now with 'realtime' text in api url because otherwise we are getting SSL error>");
_client.Options.SetRequestHeader("x-api-key", "<API KEY>");
await _client.ConnectAsync(new Uri("https://<MY-APPSYNC_API_PATH>.appsync-realtime-api.<AWS-region>.amazonaws.com/graphql"), CancellationToken.None);
await SendCommand();
var docList = await Receive();
}
catch(Exception ex)
{
}
}
static private async Task SendCommand()
{
ArraySegment<byte> outputBuffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes("'query' : 'subscription SubscribeToEventComments{ subscribeToEventComments(eventId: 'test'){ content }}'"));
await _client.SendAsync(outputBuffer, WebSocketMessageType.Text, true, CancellationToken.None);
}
static private async Task<string> Receive()
{
var receiveBufferSize = 1536;
byte[] buffer = new byte[receiveBufferSize];
var result = await _client.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
var resultJson = (new UTF8Encoding()).GetString(buffer);
return resultJson;
}
Я получаю исключение ниже:
Внутреннее исключение: «Установленное соединение было прервано программным обеспечением на вашем хост-компьютере».
Внутреннее сообщение об исключении: «Невозможно прочитать данные из транспортного соединения: установленное соединение было прервано программным обеспечением на вашем хост-компьютере».
Сообщение: «Удаленная сторона закрыла соединение WebSocket, не завершив подтверждение закрытия».
Может кто поможет с правильной реализацией.