WebSocketSharp无法捕获客户端强制关闭抛出的异常该如何处理
WebSocketSharp客户端强制关闭导致服务端异常日志无法捕获的解决方案
两种方案失效的原因
- 外层
try catch包裹启动逻辑无效:异常发生在WebSocketSharp内部独立的工作线程中,不属于启动服务的主线程调用栈,因此外层无法捕获。 - 重写
WebSocketBehavior的OnError方法无效:OnError是WebSocket完成握手、进入对应WebSocketBehavior生命周期后才会触发的事件,你遇到的异常发生在HTTP握手阶段,此时还未生成对应WebSocketBehavior实例,因此不会进入该方法。
这类异常本质是WebSocketSharp内部已经捕获的可忽略异常,默认会通过自带的日志组件输出到控制台,你只需要修改日志配置过滤这类日志即可解决问题。
解决方案
方法:自定义日志输出逻辑过滤无关异常
直接替换WebSocketServer自带日志的输出委托,过滤掉远程主机关闭连接的10054异常日志即可,其余正常日志可以保留输出,示例代码如下:
public class Echo : WebSocketBehavior { protected override void OnError(ErrorEventArgs e) { // 连接建立后的异常仍可在此处处理 } } // 服务启动逻辑 string path = "ws://localhost:111"; WebSocketServer wssv = new WebSocketServer(path); // 注册自定义WebSocket服务 wssv.AddWebSocketService<Echo>("/echo"); // 自定义日志输出逻辑,过滤强制关闭连接的异常 wssv.Log.Output = (logData, _) => { // 命中10054远程强制关闭异常则跳过输出 if (logData.Message.Contains("10054") || logData.Message.Contains("forcibly closed by the remote host")) return; // 其余日志正常输出 Console.WriteLine($"[{logData.Level}] {logData.Date:yyyy/MM/dd HH:mm:ss} | {logData.Message}"); }; // 可选:调整日志输出级别,关闭不需要的低级别日志 // wssv.Log.Level = LogLevel.Info; wssv.Start(); while (Console.ReadKey(true).Key != ConsoleKey.Enter) { } wssv.Stop();
如果需要完全关闭所有控制台日志输出,也可以直接将日志输出委托置空:
wssv.Log.Output = (_, __) => { };
内容的提问来源于stack exchange,提问作者Fede Kindred
相关产品推荐
相关产品推荐

