2014-04-17 61 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 };