SignalR - 手动设置ClientID

时间:2012-03-07 17:48:43

标签: signalr

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

3 个答案:

答案 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客户端,而不需要上述所有管道。这不起作用吗?如果工作,这行代码怎么样?