c# ClientWebSocket异常问题解决:缓冲区类型“xxx”无效。有效的缓冲区类型是:“Close”、“BinaryFragment”、“BinaryMessage”...

使用c# 的ClientWebSocket通讯时,可能会遇到如下异常:

==============

WebSocket connection error: 缓冲区类型“386”无效。有效的缓冲区类型是:“Close”、“BinaryFragment”、“BinaryMessage”、“UTF8Fragment”、“UTF8Message”。
18:15:48:823    异常:缓冲区类型“386”无效。有效的缓冲区类型是:“Close”、“BinaryFragment”、“BinaryMessage”、“UTF8Fragment”、“UTF8Message”。

===============

由于网上找不到可用方案,完全摸石头过河导致花了一些时间,特此记录:原因是因为WebSocket服务器使用了DEFLATE压缩数据,但也不是对所有数据进行了DEFLATE,服务器又是第三方的。

请教了GPT,给到的回答是:在 .NET 中,ClientWebSocket 类并没有直接提供对 WebSocket 扩展(如 DEFLATE 压缩)的原生支持,并让我手动解码,事实是ClientWebSocket在接收数据时依赖消息类型,遇到无效(压缩过的)的消息自身直接就崩溃终止连接了,意味着我也拿不到原始数据,也就无法解析...

既然知道不支持也就意味着得找个替代方案,一番研究后,我采用了开源库:WebSocketSharp,此时又遇到新问题,连接时握手失败,一番摸索后发现服务器使用了TLS1.3,而我电脑仅支持到TLS1.2,即使设置跳过证书检查也还是握手失败,还好开源项目,有幸顺利找到了解决方案:(注:系统注册表可能需要添加TLS1.3支持)

using WebSocketSharp;
private WebSocket webSocket = null;

private enum SslProtocolsHack
{
    Tls = 192,
    Tls11 = 768,
    Tls12 = 3072
}

var sslProtocolHack = (System.Security.Authentication.SslProtocols)(SslProtocolsHack.Tls12 | SslProtocolsHack.Tls11 | SslProtocolsHack.Tls);

if (webSocket == null)
{
    webSocket = new WebSocket(this.url);
    webSocket.Compression = CompressionMethod.Deflate;
    webSocket.SslConfiguration.EnabledSslProtocols = sslProtocolHack;
    webSocket.SslConfiguration.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
    //打开日志
    webSocket.Log.Level = LogLevel.Trace;
    webSocket.Log.Output = (logData, file) => Trace.WriteLine(logData.Message);
}

webSocket.OnMessage += (sender, e) =>
{
    Trace.WriteLine("Received: " + e.Data);
};

webSocket.OnOpen += (sender, e) =>
{
    Trace.WriteLine("Connected to server");
    callback?.Invoke(new WebSocketData("连接成功", WebSocketAction.CONNECT_SUCCESS));
};

webSocket.OnClose += (sender, e) =>
{
    Trace.WriteLine("Disconnected from server");
    //握手失败重试
    if (e.Code == 1015 && webSocket.SslConfiguration.EnabledSslProtocols != sslProtocolHack)
    {
        webSocket.SslConfiguration.EnabledSslProtocols = sslProtocolHack;
        webSocket.Connect();
    }
    callback?.Invoke(new WebSocketData("异常", WebSocketAction.EXCEPTION));
};

webSocket.Connect();

一顿猛如虎操作后,顺利获取到了解码后的消息。

完,祝各位童鞋好运~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值