【问题标题】:SignalR - Set ClientID ManuallySignalR - 手动设置 ClientID
【发布时间】:2020-11-16 08:21:19
【问题描述】:

我希望能够让各个用户使用 SignalR 相互发送消息,因此我需要发送到特定的客户端 ID。如何在会话开始时为特定用户定义客户端 ID - 比如用户的 GUID 主键?

【问题讨论】:

    标签: signalr


    【解决方案1】:

    将 IConnectionIdFactory 替换为您自己的 https://github.com/SignalR/SignalR/wiki/Extensibility

    示例用法: http://www.kevgriffin.com/maintaining-signalr-connectionids-across-page-instances/

    编辑:最新版本的 SignalR 不再支持此功能。但是您可以使用新的 IUserIdProvider 为特定连接定义用户 ID

    【讨论】:

    • 有没有办法在不使用cookies的情况下手动设置客户端ID?可能是 start method() 的参数,还是将信息传递给自定义连接工厂中的请求对象的另一种方式?
    • 嗨。您能否更新您对 SignalR 0.5 版的答案? AspNetHost 已被删除,现在我不知道如何在 Application_Start() 注册 IConnectionIdFactory。
    • 在 0.5 发布之前使用 0.4?
    【解决方案2】:

    在 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 - 如果涉及多个浏览器实例,则可能存在多个关联。

    【讨论】:

      【解决方案3】:

      SignalR Client Side documentation 概述了以下内容:

      connection.id - 获取或设置当前连接的客户端ID

      这当然表明应该能够在客户端设置 clientID,而无需上述所有管道。这不工作吗?如果可以,这行代码会是什么样子?

      【讨论】:

      • 我没有尝试过,但我需要能够将连接 ID 分配给服务器已知的东西,例如 GUID(用户 ID),所以 IConnectionFactory 解决方案最适合我。
      猜你喜欢
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      相关资源
      最近更新 更多