【问题标题】:SignalR cross-domain connection - connecting connection Id's with usersSignalR 跨域连接 - 将连接 ID 与用户连接
【发布时间】:2014-04-17 21:45:48
【问题描述】:

我将我的信号器集线器托管在一个单独的域上,并从我的主应用程序跨域连接到集线器。当用户登录到主应用程序时,会建立信号器连接。现在,我遇到的问题是如何识别集线器内的连接用户。

如果我的 Hub 在主应用程序中,那么我可以使用登录用户的 Context.User 并维护字典并在连接和断开连接事件上更新它们。

但是作为一个跨域连接,我没有 Context.User 并且我无法知道该连接 ID 属于谁。我迷路了。

我在这里错过了什么?

【问题讨论】:

    标签: signalr signalr-hub signalr.client


    【解决方案1】:

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

    例如客户这样发送给您

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

    在 Hub 类中:

    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);
            }
    
        }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多