我有一个客户端-服务器应用程序:服务器、常规客户端和管理员。客户端定期向服务器发送信息,服务器将其重定向到管理员。管理员可以向客户请求信息。
我有一个类的集合,在这个类中还有另外 2 个集合,其中还有几个集合。有一次我遇到了一个问题,Signal 默认有 32kb 的传输限制,我通过下面的方法增加了这个限制。
services.AddSignalR(o =>
{
o.MaximumReceiveMessageSize = null;
});
现在一切正常,但我不喜欢它。我搜索了类似的问题并找到了2个解决方案:
SendData(byte[] chunk, int pos, int total)
我考虑到SignalR不保证接收消息的顺序的信息,添加了一个pos - 当前位置。服务器收到所有部分并成功将它们转换为我们的类型后,就会开始将这些部分发送给管理员。
管理员收到 byte[],一旦收到全部,他就会自己将它们转换为我们的类型。
在研究了他们的建议后,我想出了以下方案。常规客户端通过常规 POST 请求发送数据。在服务器上,控制器(从客户端接收到此数据)向管理员发送一条消息:“嘿,我收到了数据,您可以向我请求它。”管理员发送获取请求并接收数据。
也就是说,彻底改变所有客户端和服务器之间的交互方案,即使发送的信息是一类 5 个属性,大小为 10-20 字节。
哪个解决方案是正确的或者也许还有其他解决方案?
我建议使用第二种解决方案(HTTP POST + SignalR 通知)。
原因如下
SignalR 主要是为实时通信而设计的,而不是为了传输大量数据。
jdweng提到,在数据传输方面,使用HTTP更有优势。随着需求的增加,无论是引入压缩、流式传输还是更复杂的错误处理机制,HTTP 都能很好地处理。
另外,假设不使用Azure Signalr,当用户连接较多时,假设每个连接都有数据传输需求,如果服务不扩展实例,很快就会遇到服务器性能问题,所以第一种方案不适合。