我有两个集线器,称他们为NotificationHub
和ReminderHub
。将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();
答案 0 :(得分:1)
在开始连接之前,您应确保准备好所有客户端事件处理程序,否则SignalR将无法满足它们(至少在其当前版本中)。