我有一个现有服务,在事件发生时通知大量客户端。它使用了我自己推出的长轮询机制。我正在探索用信号器集线器替换该机制,并使原型工作。但它有一个相当显着的低效率,感觉应该有一个解决方案,但我找不到它。
我理解信号器中组的想法,组显然是为了防止这种低效率,但有一个原因是我不能使用组。我希望说我需要在使用每个客户端的ConnectionId的许多客户端上使用相同的参数值调用相同的客户端方法。我可以在必要时解释原因,但它确实不合时宜。
假设我有200个ConnectionId的列表,我需要在每个传递相同对象参数的方法上调用相同的方法。如果我简单地遍历ConnectionId调用Clients.Client(ConnectionId).clientMethod(param),我假设param对象将被序列化200次。
有没有办法将参数序列化一次,然后使用已经序列化的参数调用客户端方法?
更新
我在Allow to Send Json Strings without duplicate Serialization找到了一个与github相关的问题(甚至可能是这个问题)。似乎功能被添加到signalr,但是github问题没有说明如何做到这一点,我在signalr docs中找不到任何关于它的信息。
更新2
在上面引用的github问题中,新功能仅针对PersistentConnection实现 - 而不是集线器。对于持久连接,当发送ArraySegment类型的参数时,signalr假定它是预序列化的并按原样发送它而不对其进行序列化。
出于某种原因,这没有针对集线器实现,尽管它对集线器很有用,原因与持久连接相同。
答案 0 :(得分:0)
将所有connectionId存储在Static List<string> at
OnConnected`事件中并使用以下内容,
Static List<string> allconnections = new List<string>();
public override Task OnConnected()
{
allconnections.Add(Context.ConnectionId);
return base.OnConnected();
}
Public void YourServerMethod(params)
{
Clients.Clients(allConnections).clientMethod(params)
}