Сервер закрыл соединение WebSocket, не завершив рукопожатие close

Рейтинг: 1Ответов: 0Опубликовано: 19.05.2023

У меня есть парсер, который получает обновления по Websocket и обрабатывает их в асинхронном методе. Проблема заключается в том что через 3-5 минут сервер разрывает соединение:

One or more errors occurred. (One or more errors occurred. (The remote party closed the WebSocket connection without completing the close handshake.))

while (update)
try
{
    responce = GetResponce().Result;
    Update(responce);
}
catch(Exception ex)
{
    Console.WriteLine(ex.ToString());
}

Но если убрать метод Update, ошибка не появляется и соединение работает часами:

while (update)
try
{
    responce = GetResponce().Result;
    Console.WriteLine(responce);
}
catch(Exception ex)
{
    Console.WriteLine(ex.ToString());
}

Метод Update:

private async Task Update(string responce)
{
    try { 
        foreach (var tradingPair in TradingPairs)
            if ((tradingPair.TradingPairInfo.Symbol.ToLower() + "@depth").Equals(JsonConvert.DeserializeObject<CryptoBot.Binance.JsonModels.UpdateOrderBook>(responce).stream))
            {
                double[,] asks = JsonConvert.DeserializeObject<CryptoBot.Binance.JsonModels.UpdateOrderBook>(responce).data.a;
                double[,] bids = JsonConvert.DeserializeObject<CryptoBot.Binance.JsonModels.UpdateOrderBook>(responce).data.b;
                Int64 time = JsonConvert.DeserializeObject<CryptoBot.Binance.JsonModels.UpdateOrderBook>(responce).Time;
                for (int i = 0; i < asks.Length / 2; i++)
                    tradingPair.OrderBook.Update(asks[i, 0], asks[i, 1], TypeOrder.Asks, time);
                for (int i = 0; i < bids.Length / 2; i++)
                    tradingPair.OrderBook.Update(bids[i, 0], bids[i, 1], TypeOrder.Bids, time);
                tradingPair.OrderBook.read = true;
                break;
            }
    }
    catch (Exception) { }
}

Метод GetResponce:

private async Task<string> GetResponce()
{
    StringBuilder data = new StringBuilder();
    int size;
    ArraySegment<byte> buf;
    do
    {
        buf = new ArraySegment<byte>(new byte[buffer]);
        size = webSocket.ReceiveAsync(buf, CancellationToken.None).Result.Count;
        data.Append(Encoding.UTF8.GetString(buf.ToArray(), 0, size));
    } while (size > buffer - 1);
    return data.ToString();
}

Ответы

Ответов пока нет.