Метод ReceiveAsync веб-сокета не ожидает всего сообщения.C#

Место общения программистов C#
Anonymous
Метод ReceiveAsync веб-сокета не ожидает всего сообщения.

Сообщение Anonymous »

Я получаю JSON через веб-сокет. По крайней мере: я частично. Используя онлайн-сервис веб-сокетов, я получаю полный ответ JSON (вся HTML-разметка игнорируется). Когда я смотрю на JSON, который получаю в консоли, я вижу разметку HTML (просмотр ее с помощью средства просмотра HTML во время отладки приводит к удалению HTML), но она внезапно заканчивается (неполные данные).

В моем буфере достаточно места, и я использую async-await, чтобы (предположительно) дождаться поступления всего ответа, прежде чем продолжить.

Код: Выделить всё

private async Task Receive()
{
var buffer = new byte[4096 * 20];

while (_socket.State == WebSocketState.Open)
{
var response = await _socket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);

if (response.MessageType == WebSocketMessageType.Close)
{
await
_socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Close response received",
CancellationToken.None);
}
else
{
var result = Encoding.UTF8.GetString(buffer);
var a = buffer[1000];
var b = buffer[10000];
var c = buffer[50000];
var d = buffer[81000];
Console.WriteLine(result);
var responseObject = JsonConvert.DeserializeObject(result, _requestParameters.ResponseDataType);

OnSocketReceive.Invoke(this, new SocketEventArgs {Response = responseObject });
buffer = new byte[4096 * 20];
}
}
}
На что следует обратить внимание: буфер достаточно большой, а b, c и d никогда не заполняются. Я также должен отметить, что это происходит только для запроса 1-questions-newest-tag-java, 155-questions-active работает отлично.

После некоторого копания я обнаружил, что response.CloseStatus и response.CloseStatusDescription всегда имеют значение null, response.Count всегда равно 1396 (копирование результата в Word действительно показывает, что всегда есть 1396 символов), а ответ.EndOfMessage имеет значение false.

Покопавшись в исходном коде, я обнаружил, что DefaultReceiveBufferSize равен 16 * 1024 (достаточно большой), а WebSocketGetDefaultKeepAliveInterval() ссылается на внешняя реализация (но отладчик показывает 00:00:30).

Это не вопрос времени ожидания, поскольку отладчик останавливается в тот же момент, когда онлайн-сервис получает ответ.

Почему мой метод продолжает выполняться, когда сокет еще не получил все данные?

Вернуться в «C#»