我正在尝试实现类似于此python示例但在.net https://aws.amazon.com/blogs/mobile/appsync-websockets-python/中的应用同步订阅”>
我使用nuget包GraphQL.Client https://www.nuget.org/packages/GraphQL.Client开始Query / Mutation的执行工作正常,如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.Client \ Websocket \ GraphQLHttpWebSocket.cs:line 546
然后我尝试不使用此nuget并使用标准websocket
无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; }
我正在接受以下例外:
内部异常
:“已建立的连接被主机中的软件中止。”内部异常消息
:“无法从传输连接中读取数据:已建立的连接已被主机中的软件中止。”Message
:“远程方在未完成关闭握手的情况下关闭了WebSocket连接。”任何人都可以帮助您正确实施。
我正在尝试实现类似于此python示例的应用程序同步订阅,但在.net https://aws.amazon.com/blogs/mobile/appsync-websockets-python/中,我使用nuget包开始了此操作...
Nuget无法与AppSync订阅一起使用,因此您需要为此编写自己的客户端代码,就像您在第二个(非Nuget的)示例中所尝试的。
对于其他面临相同问题的人,我现在创建了一个nuget程序包。https://www.nuget.org/packages/DotNetCSharp.AWS.AppSync.Client/1.0.0您可以按以下方式使用它。