在 .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 对象的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core - Json.NET反序列化映射

在 C# ASP NET Core 中使用 JSON 而无需反序列化

谈谈在.NET Core中使用Redis和Memcached的序列化问题

在Asp.Net Core 3.0中如何使用 Newtonsoft.Json 库序列化数据

ASP.NET Core中如何使用缓存

如何在我的 ASP.NET Core Web API 中启用 BSON 序列化?