MessageWebsocket升级请求中如何使用Sec-Websocket-Extensions

Posted

技术标签:

【中文标题】MessageWebsocket升级请求中如何使用Sec-Websocket-Extensions【英文标题】:How to use Sec-Websocket-Extensions in MessageWebsocket upgrade request 【发布时间】:2016-12-13 22:14:16 【问题描述】:

我需要使用 messagewebsocket,但文档说 SetRequestHeader 方法不支持 sec-websocket-extensions。我需要接收的数据作为单个入站 websocket 数据包整体发送。

初始 http 标头需要 sec-websocket-key 和 -version 值。

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

初始 http 标头需要 sec-websocket-key 和 -version 值。

为了通过WebSocket连接到服务器,客户端必须先向服务器发送一个打开握手。 Sec-WebSocket-Key 标头字段用于WebSocket 打开握手,必须包含它。如果没有此字段,MessageWebSocket 将无法成功连接服务器。所以实际上MessageWebSocket APIs 已经将此字段设置为标题。您不需要设置请求标头。可以使用Fiddler抓取MessageWebSocket发送的get请求,在header中会看到Set-WebSocket-KeySet-WebSocket-Version

由于此标头字段的Sec-WebSocket-Key 值必须是由随机选择的 16 字节组成的 nonce,并且必须为每个连接随机选择 nonce,因此此标头字段也不得在 HTTP 请求中出现多次,所以我们不能再次设置它。但是你可以通过代码另外设置一个Set-WebSocket-Version,虽然我认为你不需要这样做。

 messageWebSocket.SetRequestHeader("Sec-WebSocket-Verson", "666");

有关WebSocket 协议的详细信息请参考RFC6455。有关如何在 UWP 应用中使用WebSocket 的更多详细信息,请参考official sample。此示例有服务器端和客户端进行测试。

【讨论】:

我仍然无法设置版本,但我重新阅读了规范并且我试图做太多的工作。 .Net 负责处理我需要的所有标头。

以上是关于MessageWebsocket升级请求中如何使用Sec-Websocket-Extensions的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 如何响应升级请求?

如何将 HTTP 请求升级到 Websocket (Autobahn & Twisted Web)

尝试使用 websockets 从 FastAPI 获取实时数据流时如何修复错误(不支持的升级请求。)?

已解决 - 如何在 Spring 中自定义 WebSocket 升级请求的 HTTP 响应?

如何在 Visual Studio 2013 的 iOS 构建服务器中升级 cordova 版本?

系统如何响应 ITIM 5.1 到 ISIM 6.0 升级后的待处理请求 DB2 转储