通过 SignalR 发送大类的正确性如何?

问题描述 投票:0回答:1

我有一个客户端-服务器应用程序:服务器、常规客户端和管理员。客户端定期向服务器发送信息,服务器将其重定向到管理员。管理员可以向客户请求信息。

我有一个类的集合,在这个类中还有另外 2 个集合,其中还有几个集合。有一次我遇到了一个问题,Signal 默认有 32kb 的传输限制,我通过下面的方法增加了这个限制。

services.AddSignalR(o =>
{
    o.MaximumReceiveMessageSize = null;
});

现在一切正常,但我不喜欢它。我搜索了类似的问题并找到了2个解决方案:

  1. 客户端将发送的每个对象拆分为字节数组。 SignalR 保存接收到的块,并在接收到所有部分后立即将 byte[] 转换为我们的 IReadOnlyCollection 类型。
SendData(byte[] chunk, int pos, int total)

我考虑到SignalR不保证接收消息的顺序的信息,添加了一个pos - 当前位置。服务器收到所有部分并成功将它们转换为我们的类型后,就会开始将这些部分发送给管理员。

管理员收到 byte[],一旦收到全部,他就会自己将它们转换为我们的类型。

  1. 很多人说Signal不是用来发送文件的。但是大小为 10、100 或 > 1000 KB 的类的集合是否被视为文件?

在研究了他们的建议后,我想出了以下方案。常规客户端通过常规 POST 请求发送数据。在服务器上,控制器(从客户端接收到此数据)向管理员发送一条消息:“嘿,我收到了数据,您可以向我请求它。”管理员发送获取请求并接收数据。

也就是说,彻底改变所有客户端和服务器之间的交互方案,即使发送的信息是一类 5 个属性,大小为 10-20 字节。

哪个解决方案是正确的或者也许还有其他解决方案?

c# signalr asp.net-core-signalr
1个回答
0
投票

我建议使用第二种解决方案(HTTP POST + SignalR 通知)。

原因如下

  1. SignalR 主要是为实时通信而设计的,而不是为了传输大量数据。

  2. jdweng提到,在数据传输方面,使用HTTP更有优势。随着需求的增加,无论是引入压缩、流式传输还是更复杂的错误处理机制,HTTP 都能很好地处理。

  3. 另外,假设不使用Azure Signalr,当用户连接较多时,假设每个连接都有数据传输需求,如果服务不扩展实例,很快就会遇到服务器性能问题,所以第一种方案不适合。

© www.soinside.com 2019 - 2024. All rights reserved.