ClientWebSocket句柄断开连接但没有读取

时间:2019-03-07 12:47:21

标签: c# asp.net-core websocket

简短版本: 是否有人知道一种安全可靠的机制来检测服务器发起的ClientWebSocket断开连接,而无需主动从套接字读取并检查WebSocketMessageType.Close。当服务器决定断开连接时,我想异步设置CancellationToken,而接收后我可能会处理一些数据。

带有用例的长版:

在我的应用程序中,我有一个ClientWebSocket正在从服务器中获取一些数据。通过在连接上收到的初始消息,我启动了进一步的应用程序逻辑,该逻辑可能会从WebSocket读取更多数据,或者只是启动其他操作(如数据库查询)。当我启动应用程序逻辑时,我传递了一个CancellationToken,以防websocket发生意外情况。这样,如果不再需要应用程序链中的任何操作,我想取消它们。

现在的问题是,似乎只有通过与WebSocket交互(例如从中读取并检查WebSocketMessageType.Close)才能正确检测到WebSocket断开连接。但是从WebSocket读取潜在的关闭事件可能会读取一些实际的数据,这些数据应由应用程序逻辑单独完成。

想像一下快乐流:

  1. 我通过ClientWebSocket连接到服务器。
  2. 我收到一条初始WebSocketMessageType.Text消息,该消息触发了一些应用程序逻辑。
  3. 服务器开始通过WebSocketMessageType.Binary消息流传输一些数据。
  4. 在客户端应用程序上,我启动了对此数据的处理,这可能导致异步操作,并在任何地方传递一个CancellationToken。
  5. 数据已处理,我向服务器发送WebSocketMessageType.Text消息并关闭连接。

服务器可以随时决定中止此通信。它将发送关闭消息,然后关闭连接。这也可能只是KeepAlive机制或操作系统检测到的网络中断。在客户端,我希望有一个异步事件通知我有关此关闭的信息,这使我可以设置CancellationToken。

我想到了各种解决方案,但没有一个非常合适:

  1. 我想到了以0字节读取来单独轮询以检查具有2个不确定性的关闭事件。 WebSocket不支持同时从不同线程进行多次读取。我的应用程序逻辑将无法再从流中读取。我不确定WebSocket是否会忽略我的0字节接收缓冲区,并可能读取某些破坏应用程序数据框架的数据。

  2. 我的websocket上有处于活动状态的KeepAlive系统。除了只能从套接字读取外,我只能轮询当前的WebSocket StateCloseStatus。但是我也怀疑状态是否会更新,除非我从中读取。

我对这个话题有点迷茫。 C#中的WebSocket实现确实处于底层,并且通过解耦留给了很多开发人员。在JavaScript上,我只想钩住message事件以接收数据,并钩住close事件以向WebWorker发送停止信号。将数据事件和关闭事件混合到单个接收中,我看不到如何在代码中拆分它们。

0 个答案:

没有答案