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

标签 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) 访问服务器但最终遇到同一个盒子时,该功能不起作用。

向所有客户端发送消息没有问题

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/

相关文章:

azure - SignalR 部署在云上时滞后? | .Net核心

c# - SignalR 和 UploadFromStreamAsync 在 IIS Express 和 Azure 免费网站中具有不同的行为

signalr - 为什么 HTTPContext.Current.Session 在 ASP .Net MVC 应用程序中使用 SignalR 2.x 库为空?

c# - SignalR OnConnected() 中的异步方法

asp.net-mvc - 如何在我单独的 Api 和 mvc 客户端项目中使用 SignalR?

android - SignalR 与 android(Java) 有问题

java - INSTALL_FAILED_NO_MATCHING_ABIS

Azure、SignalR 和 Web Api 不向客户端发送消息

azure - WebApp 中托管的 .Net core 2.1 MVC 中的推送通知

asp.net - F# 中的 SignalR 和 SelfHost