2014-04-17 58 views
0

我在独立的域上托管我的信号中心,并从我的主应用程序跨接到中心的域连接。当用户登录到主应用程序时,建立信号连接。现在,我遇到的问题是如何识别集线器内部的连接用户。SignalR跨域连接 - 连接Id与用户的连接

如果我的Hub在主应用程序中,那么我可以使用已登录用户的Context.User并维护一个字典并在Connect和Disconnect事件中更新它们。

但作为一个跨域连接,我没有Context.User,也无法知道连接ID属于谁。我迷失在这里。

我在这里错过了什么?

回答

1

您应该自己保留用户凭据和连接ID。你应该定义List<ClientsEntity>或类似的东西。然后覆盖onConnectedonDisconnected方法。正如Lars所说,客户端必须发送查询字符串以连接到您的集线器。

例如客户端发送到你喜欢这个

$.connection.hub.qs = { 'token' : 'id' };

轮毂类:

public class ChatHub : Hub 
    { 

     static List<ClientsEntity> clientsList = new List<ClientsEntity>(); 

     public override Task OnConnected() 
     { 
      string connectionID = Context.ConnectionId; 
      string token = Context.QueryString["token"]; 

      ClientsEntity clientItem = new ClientsEntity(); 
      clientItem.connectionId = connectionID; 
      clientItem.token = token; 
      clientItem.connectionTime = DateTime.Now; 

      clientsList.Add(clientItem); 

      return base.OnConnected(); 
     } 

     public override Task OnDisconnected() 
     { 
      ClientsEntity item = clientsList.FirstOrDefault(c => c.connectionId == Context.ConnectionId); 
      if (item != null) { 
       clientsList.Remove(item); 
      } 

      return base.OnDisconnected(); 
     } 

     public override Task OnReconnected() 
     { 
      return base.OnReconnected(); 
     } 

     public void Send(string token, string message) 
     { 
      ClientsEntity user = clientsList.FirstOrDefault(c => c.token == token); 

      if (user != null) 
       Clients.Client(user.connectionId).sendMessage(token, message); 
     } 

     public void GetConnectedClients(string token) { 
      ClientsEntity user = clientsList.FirstOrDefault(c => c.token == token); 

      if(token.Equals("-1") && user != null) 
       Clients.Client(user.connectionId).getConnClients(clientsList); 
     } 

    } 
0

您可以在用户登录后为其分配唯一的连接令牌;然后让客户端在查询字符串中发送:

$.connection.hub.qs = { 'token' : id };