SignalR跨域连接 - 将连接ID​​与用户连接

时间:2014-04-17 21:45:49

标签: signalr signalr-hub signalr.client

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

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

但是作为跨域连接,我没有Context.User,也无法知道该连接ID属于谁。我迷失了。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

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

例如客户端像这样发送给您

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

    }

答案 1 :(得分:0)

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

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