如何在 SignalR 中手动将连接添加到具有多个集线器的组

How Can I Manually Add Connections to Groups with Multiple Hubs in SignalR

我有两个集线器,称它们为 NotificationHubReminderHub。将 NotificationHub 视为主要集线器,将 ReminderHub 视为我希望与 NotificationHub 分开的可选集线器。客户端将使用以下典型的服务器集线器方法连接到 NotificationHub

public override Task OnConnected()
{
    return base.OnConnected()
}

有相应的客户端连接

$.connection.hub.start().done(function() {
    subscribeToReminderHub();
});

subscribeToReminderHub();包含以下内容

subscribeToReminderHub = function() {
    reminderProxy = $.connection.reminderHub;

    reminderProxy.server.subscribe().done(function() {
        console.log('subscribed to reminder hub...');
    });
}

reminderProxy.server.subscribe()指的是ReminderHub

上的如下服务器方法
public async Task Subscribe()
{
    var currentUser = Context.User.Identity.Name.ToUpperInvariant();
    await Groups.Add(Context.ConnectionId, currentUser);
}

这一切都符合我的预期。我可以在服务器 Subscribe() 方法上打断点,也可以注销

subscribed to reminder hub...

但是,如果我随后尝试对我试图在 ReminderHub 中建立的分组中的用户调用方法,则不会发生任何事情。我在初始连接 .done() 回调中定义了两个客户端函数。考虑以下示例

public void Notify() // ... ReminderHub
{
    // ***** notification chain - step 2
    // ***** this never gets called
    var userId = Context.User.Identity.Name.ToUpperInvariant();
    Clients.Caller.notify();
}

// **** $.connection.hub.start().done(function() { **** callback
subscribeToReminderHub = function() {
    reminderProxy = $.connection.reminderHub;

    reminderProxy.server.subscribe().done(function() {
        console.log('subscribed to reminder hub...');
    });

    reminderProxy.client.queryNotifications = function () {
        // ***** notification chain - step 1
        // ***** this never gets called
        reminderProxy.server.notify();
    }

    reminderProxy.client.notify = function () {
        // ***** notification chain - step 3
        // ***** this never gets called
    }
}

启动此通知链,我正在从集线器外部调用 Notify(),例如...注意:我正在传递 userId,这将与分组相关

GlobalHost.ConnectionManager.GetHubContext<ReminderHub>().Clients.Group(userId).queryNotifications();

整期最有趣的部分

是如果我不引入第二个集线器,并在 NotificationHubOnConnected 上建立组并将所有逻辑重构回唯一集线器,则整个过程有效正如预期的那样。以某种方式引入第二个中心并尝试在 OnConnected 之外建立一个组是行不通的。有没有人经历过这个?想法?

更有趣! (太糟糕了!)

如果我打开浏览器开发工具并将以下内容明确粘贴到我的控制台中

reminderProxy.server.notify()

我在 ReminderHubNotify() 上设置了断点! 我继续 Clients.Caller.notify(); 并且客户端函数 .notify() 甚至没有在我的客户端 JS 中被调用。我根本无法理解。绕过所有摸索的问题,既然我已经引入了 ReminderHub

,我什至无法点击客户端功能

您应该确保在开始连接之前准备好所有客户端事件处理程序,否则 SignalR 将无法实现它们(至少在其当前版本中)。