無需擔心訊號器中的連線

如果要在整個應用程式中通知其他客戶端/使用者,則無需擔心連線,因為每次訪問 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;
    }        
   
}