Соединение System.Net.WebSockets ОТКРЫТО до того, как сервер прослушивает

#c# #websocket #system.net.websockets

#c# #websocket #system.net.websockets

Вопрос:

Я сталкиваюсь с проблемами в установке, которая находится под нагрузкой, принимая соединение и настраивая его на ОТКРЫТИЕ до того, как сервер будет считан для чтения из сокета.

Пример (не фактический код):

 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 немного медленнее запускает задачу, они остаются в режиме ожидания активации немного дольше, чем в неработающей системе из-за того, что рассматриваемый сервер находится под высокой нагрузкой (множество других задач / потоков и малое количествопроцессора).

Является ли это нормальным поведением и как это можно остановить?

Комментарии:

1. На веб-странице, вероятно, запущен java-код, и данные не будут возвращены до завершения java.

2. java не задействована

Ответ №1:

Если бы кто-то просмотрел мой код, этот человек обнаружил, что вызов ReceiveAsync, вызываемый позже, не является проблемой, информация находится в буфере.
Выше было указано, что обработчик событий был подключен слишком поздно.