【发布时间】:2014-01-11 23:07:26
【问题描述】:
在我的 ASP.NET 4.5 WebForms 项目中,我正在向当前连接的所有客户端发送更新通知。我有两个 Hub,其中一个向用户的其他打开的选项卡或窗口发送更新通知,另一个向其他人发送更新通知。
第一个枢纽是这样的
[Authorize]
public class SelfNotificationHub : Hub
{
public void ShowSelfNotification(string page, string type, int id, string title)
{
string username = Context.User.Identity.Name;
Clients.OthersInGroup(username).broadcastNotification(page, type, id, title);
}
public override Task OnConnected()
{
string name = Context.User.Identity.Name;
Groups.Add(Context.ConnectionId, name);
return base.OnConnected();
}
}
在这里,我添加了由会员用户创建的所有 connectionId(来自每个创建的连接用户 - 选项卡、窗口...),并将通知发送到除呼叫者之外的所有这些 id。调用者的通知以js代码显示。
另一个枢纽就像
[Authorize]
public class NotificationHub : Hub
{
public void ShowNotification(string page, string type, int id, string title)
{
string username = Context.User.Identity.Name;
Clients.Others.broadcastNotification(username, page, type, id, title);
}
}
在这一个中,我正在发送包含用户名的通知以通知其他用户。
问题是,在此配置下,用户的其他打开的选项卡和窗口正在接收来自两个集线器的通知。在第二个集线器中,我不能将用户的 connectionIds 全部排除在外,例如Clients.AllExcept(username)。 AllExcept 函数需要类型“String[] ConnectionIds”,我不知道如何获取组中的 connectionIds。这样,我可以从单个用户组创建一个 String[] 数组,并从该数组中排除 callerId。这样就可以了(我认为)。
我想我能说出我需要什么。我怎样才能不费力地完成那个场景?
谢谢!
【问题讨论】:
-
似乎你最好使用一个包含“self”和“others”方法的集线器。
-
好吧,假设我合并了两个集线器,不改变“其他集线器”的通知方式,什么都不会改变。你有什么建议?
标签: c# asp.net notifications signalr