Как использовать ожидание в методе 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.