。Net中使用GraphQL-client库的AWS Appsync实现

问题描述 投票:0回答:2

我正在尝试实现类似于此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.TaskAwaiter1.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包开始了此操作...

c# .net websocket graphql aws-appsync
2个回答
0
投票

Nuget无法与AppSync订阅一起使用,因此您需要为此编写自己的客户端代码,就像您在第二个(非Nuget的)示例中所尝试的。


0
投票

对于其他面临相同问题的人,我现在创建了一个nuget程序包。https://www.nuget.org/packages/DotNetCSharp.AWS.AppSync.Client/1.0.0您可以按以下方式使用它。

© www.soinside.com 2019 - 2024. All rights reserved.