为了向特定用户发送 SignalR 消息,我在连接时为每个用户创建一个组
public override Task OnConnected()
{
log.DebugFormat("Connected. Connection Id = {0} UserId = '{1}'", Context.ConnectionId, UserHelper.UserId);
Groups.Add(Context.ConnectionId, UserHelper.UserId);
return base.OnConnected();
}
现在,当收到消息时,我通过以下方式将其发送到一个组:
var hubContext = GlobalHost.ConnectionManager.GetHubContext<AlertsHub>();
foreach (var recipient in recipients)
{
hubContext.Clients.Group(recipient).broadcastAlertMessage("Group", msg);
}
部署到服务器时工作正常,但由于某种原因,当我通过我们公司的负载均衡器 (Citrix Netscaler SDX 11500) 访问服务器但最终遇到同一个盒子时,该功能不起作用。
向所有客户端发送消息没有问题
hubContext.Clients.All.broadcastAlertMessage("All", msg);
我还可以在内部保留连接 ID 并向特定客户端发送消息
hubContext.Clients.Client(AlertsHub.UserToConnectionIdDict["admin"]).broadcastAlertMessage("trageted client", msg);
为什么“群组”消息不起作用?
最佳答案
默认情况下,SignalR 服务器只知道并且只会向直接与其自身连接的客户端发送消息。这是因为每个 SignalR 服务器使用自己的消息总线管理自己的消息。如果没有特殊配置,SignalR 无法知道是否有其他客户端连接到同一全局地址的不同 SignalR 服务器。
幸运的是,SignalR 具有横向扩展提供程序,允许您配置所有 SignalR 服务器,使它们可以通过共享单个消息总线相互通信。
此“SignalR 中的横向扩展简介”应该为您提供使 SignalR 在负载均衡器后面正常工作所需的信息:http://www.asp.net/signalr/overview/signalr-20/performance-and-scaling/scaleout-in-signalr
关于SignalR 在通过 LoadBalancer 运行时无法向组发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21631764/