我是signalr的新手,我想为特定客户端生成连接ID并将其存储在数据库中,任何客户端完成任何更新后都会通知所有人,但将context.connectionID存储到数据库是一种好习惯,如果不是我想知道维护所有客户端之间的连接需要帮助。
答案 0 :(得分:0)
当客户端在服务器端调用函数时,您可以通过Context.ConnectionId
检索其连接ID。现在,如果您想通过集线器外部的机制访问该连接ID,您可以:
让Hub调用传递连接ID的外部方法。
通过添加public static ConcurrentDictionary<string, MyUserType>
中的字典并在OnConnected
中删除字典来管理已知连接的客户列表,例如OnDisconnected
...获得用户列表后,您可以通过外部机制查询它。
Ex 1:
public class MyHub : Hub
{
public void AHubMethod(string message)
{
// Send the current clients connection id to your external service
MyExternalSingleton.InvokeAMethod(Context.ConnectionId);
}
}
EX : 2
public class MyHub : Hub
{
public static ConcurrentDictionary<string, MyUserType> MyUsers = new ConcurrentDictionary<string, MyUserType>();
public override Task OnConnected()
{
MyUsers.TryAdd(Context.ConnectionId, new MyUserType() { ConnectionId = Context.ConnectionId });
return base.OnConnected();
}
public override Task OnDisconnected()
{
MyUserType garbage;
MyUsers.TryRemove(Context.ConnectionId, out garbage);
return base.OnDisconnected();
}
public void PushData(){
//Values is copy-on-read but Clients.Clients expects IList, hence ToList()
Clients.Clients(MyUsers.Keys.ToList()).ClientBoundEvent(data);
}
}
public class MyUserType
{
public string ConnectionId { get; set; }
// Can have whatever you want here
}
// Your external procedure then has access to all users via MyHub.MyUsers