System.Net.WebSockets Connection OPEN до того, как сервер прослушивает
У меня возникают проблемы с настройкой, которая находится под нагрузкой, принимая соединение и устанавливая его на OPEN до того, как сервер будет прочитан для чтения из сокета.
Пример (не фактический код):
while (true) {
var objContext = HttpListenerContext.GetContext();
if (objContext.Request.IsWebSocketRequest){
var WebSocket = (await HttpListenerContext.AcceptWebSocketAsync(null)).WebSocket;
while (WebSocket.State == WebSocketState.Open) {
var buffer = new byte[BUFFERSIZE];
var result = await WebSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken);
....
}
}
}
При добавлении точек останова на клиенте и сервере я заметил, что после вызова AcceptWebSocketAsync клиенты получают, что соединение "ОТКРЫТО" и готово к использованию, и начинают отправлять данные.
Проблема в том, что ReceiveAsync в то время еще не запущен, причина в том, что ReceiveAsync немного медленнее запускает задачу, они остаются в WaitingForActivation немного дольше, чем в неактивной системе, из-за того, что рассматриваемый сервер находится под высоким загрузка (множество других задач / потоков и небольшое количество процессоров).
Это нормальное поведение и как его остановить?
1 ответ
Если бы кто-то просмотрел мой код, этот человек обнаружил, что вызов ReceiveAsync не является проблемой, информация находится в буфере.
Выше было то, что обработчик событий был присоединен слишком поздно.