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