2012-03-07 55 views
18

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

回答

23

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

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

编辑:这不再SignalR的最新版本支持。但是,你可以定义一个用户ID使用新IUserIdProvider的特定连接

+0

非常好 - 感谢您的回复和博客链接! – reach4thelasers 2012-03-08 09:39:31

+2

有没有办法在不使用cookies的情况下手动设置客户端ID?也许是start()方法的一个参数,或者是将信息传递给自定义连接工厂中的请求对象的另一种方法? – 2012-03-08 15:48:25

+1

感谢您链接到我的博客! – 1kevgriff 2012-03-08 16:30:19

3

的SignalR Client Side documentation概述如下:

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

这当然表明应该能够设置clientID客户端,没有所有上述管道。这不工作?如果工作,这行代码将如何?

+0

我还没有尝试过,但我需要能够将连接ID​​分配给服务器已知的某些内容,例如GUID(用户ID),因此IConnectionFactory解决方案对我来说最适合。 – reach4thelasers 2012-04-24 13:38:29

+0

+1虽然提高它 – reach4thelasers 2012-04-24 13:38:48

5

在使用集线器方法的SignalR版本1中,我重写了Hub OnConnected()方法,并将.NET成员资格userId与当前连接标识(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事件,我可以从数据库协会(S)与当前的用户id制定出的ConnectionId - 有如果涉及多个浏览器实例,则可能会多于一个关联。

+0

你有这样的例子吗? – CR41G14 2013-03-11 09:31:41

+0

我已经用示例更新了我的答案 – 2013-03-11 11:59:59