我正在使用 .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”的示例
在 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);