【发布时间】:2020-11-16 08:21:19
【问题描述】:
我希望能够让各个用户使用 SignalR 相互发送消息,因此我需要发送到特定的客户端 ID。如何在会话开始时为特定用户定义客户端 ID - 比如用户的 GUID 主键?
【问题讨论】:
标签: signalr
我希望能够让各个用户使用 SignalR 相互发送消息,因此我需要发送到特定的客户端 ID。如何在会话开始时为特定用户定义客户端 ID - 比如用户的 GUID 主键?
【问题讨论】:
标签: signalr
将 IConnectionIdFactory 替换为您自己的 https://github.com/SignalR/SignalR/wiki/Extensibility。
示例用法: http://www.kevgriffin.com/maintaining-signalr-connectionids-across-page-instances/
编辑:最新版本的 SignalR 不再支持此功能。但是您可以使用新的 IUserIdProvider 为特定连接定义用户 ID
【讨论】:
在 SignalR 版本 1 中,我使用 Hubs 方法覆盖 Hub OnConnected() 方法,并将 .NET 成员身份 userId 与当前连接 ID (Context.ConnectionId) 的关联保存在 SQL 数据库中。
然后我重写 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 - 如果涉及多个浏览器实例,则可能存在多个关联。
【讨论】:
SignalR Client Side documentation 概述了以下内容:
connection.id - 获取或设置当前连接的客户端ID
这当然表明应该能够在客户端设置 clientID,而无需上述所有管道。这不工作吗?如果可以,这行代码会是什么样子?
【讨论】: