How to use await in ReceiveAsync method in ClientWebsocket class?

0

I am trying to use Websocket in .NET Core using C#. I want to get stream data from a Websocket server continuously and call back function when ReceiveAsync gets data. My code is as below.

    private void SendRequest()
    {
        var querySendAwaiter = ws.SendAsync(message.GetRequestMessage(), WebSocketMessageType.Text, true, CancellationToken.None).GetAwaiter();
        querySendAwaiter.GetResult();

        var queryReceiveAwaiter = ws.ReceiveAsync(message.body.buffer, CancellationToken.None).GetAwaiter();
        WebSocketReceiveResult queryReceiveResult = queryReceiveAwaiter.GetResult();

        if (ws.State != WebSocketState.Open)
        {
            Console.WriteLine($"In requesting Websocket return value {ws.State}. close connection.");
            ws.Abort();
            return;
        }
        Console.WriteLine(Encoding.UTF8.GetString(message.body.buffer_, 0, queryReceiveResult.Count));

        StartSubscription();
    }

    private async Task StartSubscription()
    {
        Console.WriteLine(ws.State);
        var task = await ws.ReceiveAsync(message.body.buffer, CancellationToken.None);

        Console.Write(task.MessageType);
        Console.WriteLine(message.body.buffer_[0]);

    /* call a call back function here */
    StartSubscription();
    }

A problem is the two WriteLine functions were not called and my program finished before receiving Websocket data. (I am not sure for it but no data came into my debug console).

    private void SendRequest()
    {
        var querySendAwaiter = ws.SendAsync(message.GetRequestMessage(), WebSocketMessageType.Text, true, CancellationToken.None).GetAwaiter();
        querySendAwaiter.GetResult();

        var queryReceiveAwaiter = ws.ReceiveAsync(message.body.buffer, CancellationToken.None).GetAwaiter();
        WebSocketReceiveResult queryReceiveResult = queryReceiveAwaiter.GetResult();

        if (ws.State != WebSocketState.Open)
        {
            Console.WriteLine($"In requesting Websocket return value {ws.State}. close connection.");
            ws.Abort();
            return;
        }
        Console.WriteLine(Encoding.UTF8.GetString(message.body.buffer_, 0, queryReceiveResult.Count));

        StartSubscription();
    }

    private  void StartSubscription()
    {
        Console.WriteLine(ws.State);
        while (true)
        {
            var receiveMessageAwaiter = ws.ReceiveAsync(message.body.buffer, CancellationToken.None).GetAwaiter();
            WebSocketReceiveResult res = receiveMessageAwaiter.GetResult();
            Console.WriteLine(Encoding.UTF8.GetString(message.body.buffer_, 0, res.Count));
        }
    }

When I tried above code I got

System.Net.WebSockets.WebSocketException (0x80004005): The remote party closed the WebSocket connection without completing the close handshake.
 ---> System.Net.WebSockets.WebSocketException (0x80004005): The remote party closed the WebSocket connection without completing the close handshake.
   at System.Net.WebSockets.ManagedWebSocket.ThrowIfEOFUnexpected(Boolean throwOnPrematureClosure)
   at System.Net.WebSockets.ManagedWebSocket.EnsureBufferContainsAsync(Int32 minimumRequiredBytes, CancellationToken cancellationToken, Boolean throwOnPrematureClosure)

this error although the connection state was open. Please let me know the correct way to use ReceiveAsync.

c#
.net-core
system.net.websockets
asked on Stack Overflow Mar 5, 2020 by wwwwe • edited Mar 5, 2020 by Heretic Monkey

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0