无需担心信号器中的连接

如果要在整个应用程序中通知其他客户端/用户,则无需担心连接,因为每次访问 Web 应用程序中的其他页面时都会创建信号器新连接。

我们可以利用信号器的用户功能来实现相同的功能。看下面的例子:

这里我们基于 projectid 创建,当我们访问$ .connection.notificationHub.server.NotifyOthersInGroup(projectid, projectname)时,该组的所有其他用户都会收到通知。来自客户端 javascript 文件

//信号集线器的 Hub 示例

public class NotificationHub:Hub {

    public static readonly ConcurrentDictionary<string, HashSet<string>>         
       ProjectLockUsers = new ConcurrentDictionary<string,HashSet<string>>();

    public void JoinGroup(int projectid)
    {
        string groupname = string.Format("ProjectLock_{0}", projectid);
        Groups.Add(Context.ConnectionId, groupname);

        AddUserToProjectLockGroup(groupname, Context.User.Identity.Name);
    }

    public void NotifyOthersInGroup(int projectid,string name)
    {
        string groupname = string.Format("ProjectLock_{0}", projectid);
        
        var allusers=null as HashSet<string>;

        if (ProjectLockUsers.TryGetValue(groupname, out allusers))
        {
            allusers.Remove(Context.User.Identity.Name);
            Clients.Users(allusers.ToList()).notifyUnlock(name);
        }
    }

    public override Task OnConnected()
    {
        return base.OnConnected();
    }
    public override Task OnDisconnected(bool stopCalled)
    {
        return base.OnDisconnected(stopCalled);
    }
    

    private void AddUserToProjectLockGroup(string projectId,string userId)
    {
        var userIds = null as HashSet<string>;            
        

        if (Sessions.TryGetValue(projectId, out userIds) == false)
        {
            userIds = Sessions[projectId] = new HashSet<string>();
        }

        userIds.Add(userId);

        ProjectLockUsers[projectId] = userIds;
    }        
   
}