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

时间:2015-04-20 19:27:18

标签: c# asp.net 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()方法上找到一个断点,并注销

  

订阅了提醒中心...

但是,如果我尝试在我尝试在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();

整个问题中最有趣的部分

如果我没有引入第二个集线器,并在NotificationHub的{​​{1}}上建立该组,并将所有逻辑重新计算回唯一的集线器,则整个过程按预期工作。以某种方式引入第二个集线器并尝试在OnConnected之外建立一个组是行不通的。有没有人经历过这个?想法?

更有趣! (太可怕了!)

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

  

OnConnected

我在reminderProxy.server.notify()的{​​{1}}点击了断点! 我继续ReminderHub,客户端函数Notify()甚至没有在我的客户端JS中调用。我根本无法理解。绕过所有摸索的问题,我现在甚至无法点击客户端功能Clients.Caller.notify();

1 个答案:

答案 0 :(得分:1)

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