在通过LoadBalancer运行时,SignalR无法向组发送消息

时间:2014-02-07 15:36:07

标签: signalr

为了向特定用户发送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);

为什么“群组”消息不起作用?

1 个答案:

答案 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