简短版本:
是否有人知道一种安全可靠的机制来检测服务器发起的ClientWebSocket
断开连接,而无需主动从套接字读取并检查WebSocketMessageType.Close
。当服务器决定断开连接时,我想异步设置CancellationToken
,而接收后我可能会处理一些数据。
带有用例的长版:
在我的应用程序中,我有一个ClientWebSocket
正在从服务器中获取一些数据。通过在连接上收到的初始消息,我启动了进一步的应用程序逻辑,该逻辑可能会从WebSocket读取更多数据,或者只是启动其他操作(如数据库查询)。当我启动应用程序逻辑时,我传递了一个CancellationToken
,以防websocket发生意外情况。这样,如果不再需要应用程序链中的任何操作,我想取消它们。
现在的问题是,似乎只有通过与WebSocket交互(例如从中读取并检查WebSocketMessageType.Close
)才能正确检测到WebSocket断开连接。但是从WebSocket读取潜在的关闭事件可能会读取一些实际的数据,这些数据应由应用程序逻辑单独完成。
想像一下快乐流:
WebSocketMessageType.Text
消息,该消息触发了一些应用程序逻辑。 WebSocketMessageType.Binary
消息流传输一些数据。WebSocketMessageType.Text
消息并关闭连接。 服务器可以随时决定中止此通信。它将发送关闭消息,然后关闭连接。这也可能只是KeepAlive机制或操作系统检测到的网络中断。在客户端,我希望有一个异步事件通知我有关此关闭的信息,这使我可以设置CancellationToken。
我想到了各种解决方案,但没有一个非常合适:
我想到了以0字节读取来单独轮询以检查具有2个不确定性的关闭事件。 WebSocket不支持同时从不同线程进行多次读取。我的应用程序逻辑将无法再从流中读取。我不确定WebSocket是否会忽略我的0字节接收缓冲区,并可能读取某些破坏应用程序数据框架的数据。
我的websocket上有处于活动状态的KeepAlive系统。除了只能从套接字读取外,我只能轮询当前的WebSocket State
和CloseStatus
。但是我也怀疑状态是否会更新,除非我从中读取。
我对这个话题有点迷茫。 C#中的WebSocket实现确实处于底层,并且通过解耦留给了很多开发人员。在JavaScript上,我只想钩住message
事件以接收数据,并钩住close
事件以向WebWorker发送停止信号。将数据事件和关闭事件混合到单个接收中,我看不到如何在代码中拆分它们。