为了向特定用户发送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)访问服务器时却无法正常工作,但最终还是打到同一个盒子。< / p>
向所有客户发送消息没有问题
hubContext.Clients.All.broadcastAlertMessage("All", msg);
此外,我可以在内部保留连接ID并向特定客户端发送消息
hubContext.Clients.Client(AlertsHub.UserToConnectionIdDict["admin"]).broadcastAlertMessage("trageted client", msg);
为什么“群组”消息不起作用?
答案 0 :(得分:2)
默认情况下,SignalR服务器只知道并且只会向直接连接到自身的客户端发送消息。这是因为每个SignalR服务器使用自己的消息总线管理自己的消息。如果没有特殊配置,SignalR无法知道是否有其他客户端连接到同一全球地址的不同SignalR服务器。
幸运的是,SignalR具有横向扩展提供程序,允许您以可通过共享单个消息总线相互通信的方式配置所有SignalR服务器。
这个“SignalR中的Scaleout简介”应该为您提供使SignalR在负载均衡器后面正常工作所需的信息:http://www.asp.net/signalr/overview/signalr-20/performance-and-scaling/scaleout-in-signalr