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-Key
和Set-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的主要内容,如果未能解决你的问题,请参考以下文章
如何将 HTTP 请求升级到 Websocket (Autobahn & Twisted Web)
尝试使用 websockets 从 FastAPI 获取实时数据流时如何修复错误(不支持的升级请求。)?
已解决 - 如何在 Spring 中自定义 WebSocket 升级请求的 HTTP 响应?