0

我想做一个 websocket 客户端来连接第三方 web socket 服务器。

我正在使用 ClientWebSocket 类:

public WSClientService(ClientWebSocket client, ILogger<WSClientService> logger)
{
    _client = client;
    _logger = logger;
}

对于接收消息,我使用此方法:

public async Task GetMessagesAsync()
{
    while (_client.State == WebSocketState.Open)
    {
        var chunkSize = 1024 * 4;
        var buffer = new ArraySegment<byte>(new byte[chunkSize]);

        do
        {
            WebSocketReceiveResult result;
            using var ms = new MemoryStream();
            try
            {
                do
                {
                    //here throws exception
                    result = await _client.ReceiveAsync(buffer, CancellationToken.None);
                    ms.Write(buffer.Array, buffer.Offset, result.Count);
                } while (!result.EndOfMessage);

                if (result.MessageType == WebSocketMessageType.Close)
                {
                    break;
                }

                ms.Seek(0, SeekOrigin.Begin);
                using var reader = new StreamReader(ms, Encoding.UTF8);
                var message = await reader.ReadToEndAsync();
                _logger.LogInformation(message);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex.Message);
            }

        } while (_client.State != WebSocketState.Aborted);                
    }
}

但是对于某些消息,我会收到此异常消息: The WebSocket received a frame with one or more reserved bits set 我注意到这可能是由于某种压缩而发生的,因为我可以接收小消息。调用这个时抛出的异常result = await _client.ReceiveAsync(buffer, CancellationToken.None);

有谁知道如何解决这个问题?

4

1 回答 1

0

该解决方案随 .net 6 版本一起提供。那么问题就出现了,因为没有办法在.net 5 和后面的内置 ClientWebSocket 中添加压缩(除非有人会为压缩创建扩展方法)。现在 .net 6 有一个名为 .net 的新选项DangerousDeflateOptions。这也添加了相应的标题。

_ws.Options.DangerousDeflateOptions = new WebSocketDeflateOptions
{
    ServerContextTakeover = false,
    ClientMaxWindowBits = 15 // this is the default value
};

await _ws.ConnectAsync(new Uri(_url), token).ConfigureAwait(false);
于 2021-11-21T11:04:01.993 回答