如何在 .NET 6 中的 WebSocket 中启用压缩

问题描述 投票:0回答:1

我正在使用 .NET 6 建立 WebSocket 连接,并且我正在使用“ClientWebSocket”来使用它。我知道服务器支持以下握手中的“permessage-deflate”。

GET / HTTP/1.1
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: 4Qecg52c4NaUM7RDCcW9/g==
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Host: domainname:64901
 
HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Accept: +lpWMhWJ1SpnmxcxRtx/Bk+k5q8=
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits=15

所以在.NET中当我想启用“permessage-deflate”时

要启用“ClientWebSocket”上的哪些选项? 如果需要,为“permessage-deflate”设置的“WebSocketDeflateOptions”对象的值是什么? 单独添加请求头

"Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits"
可以进行压缩吗?

压缩/解压缩是否需要在手动发送/接收内容之前/之后完成,或者由 ClientWebSocket 对象内部处理?

需要一个在 .NET 6 中启用“permessage-deflate”的示例

c# asp.net-core websocket .net-6.0 clientwebsocket
1个回答
0
投票

在 WebSocket 中,客户端通常使用 WebSocketDeflateOptions 请求压缩。服务器接受此请求并在 WebSocket 握手期间协商压缩。服务器不需要显式设置压缩选项。

客户

ClientWebSocket clientWebSocket = new ClientWebSocket();

clientWebSocket.Options.DangerousDeflateOptions = new WebSocketDeflateOptions
{
    ClientMaxWindowBits = 15,           // Max window size for client compression (15 bits is the maximum allowed)
    ServerMaxWindowBits = 15,           // Max window size for server compression
    ClientContextTakeover = true,       // Enable client-side context takeover (preserve compression context between messages)
    ServerContextTakeover = true        // Enable server-side context takeover
};

await clientWebSocket.ConnectAsync(new Uri("ws://127.0.0.1:8085/"), CancellationToken.None);
byte[] receiveBuffer = new byte[2048];
WebSocketReceiveResult receiveResult = await clientWebSocket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer),
       CancellationToken.None);
string receivedMessage = Encoding.UTF8.GetString(receiveBuffer, 0, receiveResult.Count);
Console.WriteLine(receivedMessage);
© www.soinside.com 2019 - 2024. All rights reserved.