Обработка «System.Net.Websocket-Exception: удаленная сторона закрывает соединение без завершения рукопожатия». - PullRequest
1 голос
/ 25 июня 2019

Я могу общаться, если я постоянно общаюсь. Если я оставляю на 2-3 минуты закрытое соединение WebSocket без сообщения об ошибке рукопожатия, я получаю, я не знаю, как справиться.

Может кто-нибудь, пожалуйста, помогите, как обработать исключение. Я приложил журнал аварий, и вот мой код.

Crash Report

нажмите на изображение, чтобы увидеть полную ошибку


public async void ConnectToServerAsync()
{
    await client.ConnectAsync(new Uri("ws://api.testurl.com/ws"), CancellationToken.None);


    UpdateClientState();

    await Task.Factory.StartNew(async () =>
    {
        Refresh();
        while (client.State == WebSocketState.Open)
        {
            WebSocketReceiveResult result;
            var message = new ArraySegment<byte>(new byte[4096]);
            var allBytes = new List<byte>();
            do
            {
                result = await client.ReceiveAsync(message, CancellationToken.None);   

                for (int i = 0; i < result.Count; i++)
                {
                    allBytes.Add(message.Array[i]);
                }

            } while (!result.EndOfMessage);
            try
            {
                Debug.WriteLine("End of Message2 :" + result.EndOfMessage);
                Debug.WriteLine("All Bytes :" + allBytes.ToString());
                // Optional step to convert to a string (UTF-8 encoding).
                var serialisedMessae = Encoding.UTF8.GetString(allBytes.ToArray(), 0, allBytes.Count);
                var msg = JsonConvert.DeserializeObject<List<ChatModel>>(serialisedMessae);
                Debug.WriteLine("Message Count :" + msg.Count);
                if (Chatlist.Count != msg.Count)
                {
                    Chatlist.Clear();
                    foreach (var item in msg)
                    {
                        var details = new ChatModel()
                        {
                            Message = item.Message,
                            MessageFrom = item.MessageFrom,
                            MessageTo = item.MessageTo,
                            RoomId = item.RoomId,
                            _id = item._id,
                            TimeStamp = item.TimeStamp.ToLocalTime()
                        };
                        Chatlist.Insert(0, details);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Invalide message format. {ex.Message}");
            }
        }
    }, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);

    void UpdateClientState()
    {
        OnPropertyChanged(nameof(IsConnected));
        sendMessageCommand.ChangeCanExecute();
        Console.WriteLine($"Websocket state {client.State}");
    }
}

1 Ответ

0 голосов
/ 25 июня 2019

В идеале, когда вы завершили работу с WebSocket, вам нужно закрыть его, используя что-то вроде следующего:

await client.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "closing websocket", CancellationToken.None);

Это должно решить проблему. Или просто не создавайте заново WebSocket после его открытия. Я не видел код создания клиента в вашем посте выше, но я предполагаю, что по какой-то причине он пытается заново создать WebSocket, но у него уже есть существующее соединение, и поэтому выдает эту ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...