Как использовать ожидание в методе ReceiveAsync в классе ClientWebsocket?

Я пытаюсь использовать Websocket в.NET Core с помощью C#. Я хочу постоянно получать данные потока с сервера Websocket и вызывать функцию, когда ReceiveAsync получает данные. Мой код приведен ниже.

    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();
    }

Проблема в том, что две функции WriteLine не были вызваны, и моя программа завершилась до получения данных Websocket. (Я не уверен в этом, но в мою консоль отладки не поступало никаких данных).

    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));
        }
    }

Когда я попробовал код выше, я получил

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)

эта ошибка, хотя состояние соединения было открытым. Пожалуйста, дайте мне знать, как правильно использовать ReceiveAsync.

0 ответов

Другие вопросы по тегам