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