我读过: http://www.asp.net/signalr/overview/signalr-20/hubs-api/mapping-users-to-connections
并且......我在想通过设置自定义UserIdProvider,它会阻止我将连接映射到真实用户,然后将其缓存以支持多个服务器,但也许我错过了一些东西。
我可以向特定用户发送消息: context.Clients.User(“xxx”)。方法......没问题。
但是,我认为无法判断用户ID是否已断开连接...因为已释放所有具有该用户ID的连接ID。这使得用户id提供程序几乎无用,因为我现在被迫创建自己的连接ID映射到唯一的用户ID,然后在断开连接时删除连接ID,这样我就可以知道何时连接ID列表与用户ID为空。我在这里错过了什么吗? 我希望能够判断给定的用户ID是否已连接。这可能吗?最终我想知道它们何时全部断开连接(即:用户完全断开连接,因为...已关闭所有带连接的选项卡)。
类似的东西:
context.Clients.User(x).HasConnections() or context.Clients.User(x).ConnectionCount
我也没有看到调用GetUserId的方法......我在其他示例中看到Context.User.GetUserId(),但这个方法对我来说不存在。我正在使用最新版本的SignalR。我的get user id方法似乎从SignalR本身被称为好。现在我必须直接调用它而不是通过对象模型:
private string GetUserId(HubCallerContext context)
{
return new UserIdProvider().GetUserId(Context.Request);
}
答案 0 :(得分:0)
如果将连接用户的状态保存在某种数据库或服务器之间的某些其他共享存储中,则可以执行此操作 然后,您可以在尝试将数据发送到ConnectionId之前查询该数据库
public class MyHub : Hub
{
public override Task OnConnected()
{
DAL.UserConnected(Context.ConnectionId);
return base.OnConnected();
}
public override Task OnDisconnected()
{
DAL.UserNotConnected(Context.ConnectionId);
return base.OnDisconnected();
}
}