IIS 8 WebSockets permessage-deflate

IIS 8 WebSockets with permessage-deflate

我正在尝试在 IIS 8 中启用 WebSocket-Extension permessage-deflate,但到目前为止还没有成功。看起来,IIS 不支持任何扩展并且不响应 Sec-WebSockets-Extension header。

我尝试通过 Response.Headers.Add("Sec-WebSockets-Extension", "permessage-deflate; client_no_context_takeover; server_no_context_takeover") 手动发送,并在 sending/after 接收之前通过 DeflateStream 手动发送 compression/decompression,但随后 WebSocket 的接收方法失败.

我也尝试将 WebSocket 手动实现为 OWIN-Middleware(在库 vtortola 的帮助下),但 IIS 一直关闭我的 InputStream 并且无法读取数据可能。

有没有人成功启用此功能?

恐怕无法通过System.Web.WebSockets

https://www.rfc-editor.org/rfc/rfc7692#section-6

虽然您可以为 deflate 模式指定 HTTP headers,但消息需要激活位 RSV1 才能被识别为压缩:

This document allocates the RSV1 bit of the WebSocket header for PMCEs and calls the bit the "Per-Message Compressed" bit. On a WebSocket connection where a PMCE is in use, this bit indicates whether a message is compressed or not.

因此,即使您压缩了有效负载,由于消息 header 没有打开压缩位,接收方仍会尝试以未压缩的方式读取。一旦你通过 HTTP 升级机制协商了 deflate 模式,你仍然可以将压缩和未压缩的消息一起发送,这是因为 deflate 对小负载无效,所以有些消息可能不值得压缩。

也就是说,由于 ASP.NET 中的 WebSocket API 不允许您计算消息选项,恐怕无法完成。

现在,关于 OWIN。我不得不说我还没有探索这条路,但是,我怀疑这是可能的,至少在与 HTTP 相同的端口中与 IIS8 集成,这可能是您想要做的。