WebSocketSharp не может перехватывать исключения

#c# #sockets #exception #websocket

Вопрос:

У меня возникли проблемы с отловом и обработкой исключений, создаваемых websocketsharp

Когда я подключаюсь к серверу с клиентом и закрываю клиент просто кнопкой ALT F4 или X, сервер получает исключение принудительного закрытия соединения.

Несмотря на то, что эти исключения не приведут к сбою программы, это приведет к тому, что консоль будет заполнена этими исключениями, важные сообщения и журналы будут удалены, и ничего нельзя будет прочитать (есть много клиентов).

Это исключение:

 7/28/2021 6:41:56 AM|Fatal|<>c__DisplayClass71_0.<receiveRequest>b__0:0|WebSocketSharp.WebSocketException: An exception has occurred while reading an HTTP request/response.
                            ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host..
                            ---> System.Net.Sockets.SocketException (10054): An existing connection was forcibly closed by the remote host.
                              --- End of inner exception stack trace ---
                              at System.Net.Sockets.NetworkStream.Read(Span`1 buffer)
                              at System.Net.Sockets.NetworkStream.ReadByte()
                              at WebSocketSharp.HttpBase.readHeaders(Stream stream, Int32 maxLength)
                              at WebSocketSharp.HttpBase.Read[T](Stream stream, Func`2 parser, Int32 millisecondsTimeout)
                              --- End of inner exception stack trace ---
                              at WebSocketSharp.HttpBase.Read[T](Stream stream, Func`2 parser, Int32 millisecondsTimeout)
                              at WebSocketSharp.HttpRequest.Read(Stream stream, Int32 millisecondsTimeout)
                              at WebSocketSharp.Net.WebSockets.TcpListenerWebSocketContext..ctor(TcpClient tcpClient, String protocol, Boolean secure, ServerSslConfiguration sslConfig, Logger logger)
                              at WebSocketSharp.Ext.GetWebSocketContext(TcpClient tcpClient, String protocol, Boolean secure, ServerSslConfiguration sslConfig, Logger logger)
                              at WebSocketSharp.Server.WebSocketServer.<>c__DisplayClass71_0.<receiveRequest>b__0(Object state)
 

Я пробовал использовать

     public class Echo : WebSocketBehavior
    {
        protected override void OnError(ErrorEventArgs e)
        {
            //handle
        }
 

Я попытался обернуть сервер websocket в ловушку try

             try
            {
                string path = "ws://localhost:111";
                WebSocketServer wssv = new WebSocketServer(path);
                wssv.Start();
                while (Console.ReadKey(true).Key != ConsoleKey.Enter) { }
                wssv.Stop();
            } catch { }
 

Ничего не работает, исключение будет выдано и показано на консоли, что бы я ни пытался.
Поэтому вопрос в том, как вы улавливаете эти исключения?

Ответ №1:

Я смог решить проблему, полностью отключив/скрыв вывод журналов.

 public static void Disable(this Logger logger)
{
    var field = logger.GetType().GetField("_output", BindingFlags.NonPublic | BindingFlags.Instance);
    field?.SetValue(logger, new Action<LogData, string>((d, s) => { }));
}