无需担心信号器中的连接
如果要在整个应用程序中通知其他客户端/用户,则无需担心连接,因为每次访问 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;
}
}