Signalr 信令器跨域连接-连接连接Id';与用户的互动

Signalr 信令器跨域连接-连接连接Id';与用户的互动,signalr,signalr-hub,signalr.client,Signalr,Signalr Hub,Signalr.client,我在一个单独的域上托管我的signarhub,并从我的主应用程序跨域连接到hub。当用户登录到主应用程序时,将建立信号器连接。现在,我遇到的问题是如何识别集线器中的已连接用户 如果我的集线器在主应用程序中,那么我可以使用登录用户的Context.User,维护一个字典,并在连接和断开连接事件时更新它们 但作为一个跨域连接,我没有Context.User,也无法知道该连接ID属于谁。我在这里迷路了 我在这里遗漏了什么?用户登录后,您可以为其分配一个唯一的连接令牌;然后让客户端在查询字符串中发送:

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

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

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


我在这里遗漏了什么?

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

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

您应该自己保存用户凭据和连接ID。您应该定义
列表
或类似的内容。然后重写已连接的和已断开的方法。正如Lars所说,客户必须发送querystring以连接到您的中心

例如,客户发送给您的信息如下

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

    }
公共类聊天中心:中心
{
静态列表clientsList=新列表();
已连接的公用覆盖任务()
{
字符串connectionID=Context.connectionID;
string token=Context.QueryString[“token”];
ClientsEntity clientItem=新的ClientsEntity();
clientItem.connectionId=connectionId;
clientItem.token=令牌;
clientItem.connectionTime=DateTime.Now;
clientsList.Add(clientItem);
返回base.OnConnected();
}
公共覆盖任务OnDisconnected()
{
ClientsEntity item=clientsList.FirstOrDefault(c=>c.connectionId==Context.connectionId);
如果(项!=null){
客户列表。删除(项目);
}
返回base.OnDisconnected();
}
已重新连接的公用覆盖任务()
{
返回base.OnReconnected();
}
公共无效发送(字符串令牌、字符串消息)
{
ClientsEntity user=clientsList.FirstOrDefault(c=>c.token==token);
如果(用户!=null)
Clients.Client(user.connectionId).sendMessage(令牌,消息);
}
public void GetConnectedClient(字符串令牌){
ClientsEntity user=clientsList.FirstOrDefault(c=>c.token==token);
if(token.Equals(“-1”)&&user!=null)
Clients.Client(user.connectionId).getConnConClients(clientsList);
}
}