我希望能够让各个用户使用SignalR向对方发送消息,因此我需要发送到特定的客户端ID。如何在会话开始时为特定用户定义客户端ID - 比如用户的GUID主键?
答案 0 :(得分:23)
将IConnectionIdFactory替换为您自己的https://github.com/SignalR/SignalR/wiki/Extensibility。
样品用法: http://www.kevgriffin.com/maintaining-signalr-connectionids-across-page-instances/
编辑:最新版本的SignalR不再支持此功能。但您可以使用新的IUserIdProvider
为特定连接定义用户ID答案 1 :(得分:5)
在使用Hubs方法的SignalR版本1中,我覆盖了Hub OnConnected()方法,并在.NET数据库中保存了.NET成员身份userId与当前连接ID(Context.ConnectionId)的关联。
然后我重写Hub OnDisconnected()方法并删除.NET成员资格userId和当前连接ID之间的关联。这意味着在页面重新加载userId / connectionId关联将是最新的。
有些事情:
public class MyHub : Hub
{
private MembershipUser _user
{
get { return Membership.GetUser(); }
}
private Guid _userId
{
get { return (Guid) _user.ProviderUserKey; }
}
private Guid _connectionId
{
get { return Guid.Parse(Context.ConnectionId); }
}
public override Task OnConnected()
{
var userConnectionRepository = new UserConnectionRepository();
userConnectionRepository.Create(_userId, _connectionId);
userConnectionRepository.Submit();
return base.OnConnected();
}
public override Task OnDisconnected()
{
var userConnectionRepository = new UserConnectionRepository();
userConnectionRepository.Delete(_userId, _connectionId);
userConnectionRepository.Submit();
return base.OnDisconnected();
}
}
然后,当我需要为特定用户触发SignalR事件时,我可以使用当前userId计算出数据库关联中的connectionId - 如果涉及多个浏览器实例,则可能存在多个关联。 / p>
答案 2 :(得分:3)
SignalR Client Side documentation概述了以下内容:
<强> connection.id 强> - 获取或设置当前连接的客户端ID
这肯定表明应该能够设置clientID客户端,而不需要上述所有管道。这不起作用吗?如果工作,这行代码怎么样?