You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 20:24:01