【发布时间】:2021-12-28 00:17:05
【问题描述】:
基于 System.Net.WebSocket 创建服务器很容易,客户端套接字连接,然后我可以将它们保存在并发字典中,例如 ConcurrentDictionary
但这对于真正的应用程序来说并不好,在同一地址后面会运行同一个 WebSocket 服务器的多个实例,并且返回的响应实际上应该到达特定的 WebSocket 服务器,这超出了它的预期,并且代表单点故障。所以我需要将 WebSocket 对象保存在数据库或 Azure 存储表或类似的东西中,所有服务器实例都可以访问客户端套接字,以便它们可以使用它们将消息发送回客户端。
我尝试了很多方法,但找不到序列化 WebSocket 的方法。 JSON 序列化不起作用,二进制序列化也不起作用,因为在该抽象类中没有任何东西是可序列化的,此外二进制序列化现在被认为已过时,不应使用。那么有什么想法可以解决这个问题吗?
我不想在任何情况下使用 SignalR。
谢谢。
【问题讨论】:
-
WebSocket 对象是瞬态的 - 尝试在会话之间保存它似乎没有意义。
-
明白,但确实有道理。通过每 120 秒或其他时间发送 ping 请求,连接建立并保持打开状态。这是在 TCP 堆栈之上,因为当使用 ws 时协议会发生变化,并且从那里它与 TCP 和 http 协议无关。但是如果你有一个后端,那么就不能只有一个服务器来保持所有客户端套接字的进程,以便它可以从服务器端推送数据。必须有多个服务器,每个都在自己的进程中,在负载均衡器后面,可以在同一个连接池上运行。