繁体   English   中英

WebSocketSharp 无法捕获异常

[英]WebSocketSharp cannot catch exceptions

我在捕获和处理 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 catch 中

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

没有任何效果,无论我尝试什么,异常都会抛出并显示在控制台上。 所以问题是,你如何捕捉这些异常?

我能够解决完全禁用/隐藏日志输出的问题。

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) => { }));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM