Signalr 信令器跨域连接-连接连接Id';与用户的互动
我在一个单独的域上托管我的signarhub,并从我的主应用程序跨域连接到hub。当用户登录到主应用程序时,将建立信号器连接。现在,我遇到的问题是如何识别集线器中的已连接用户 如果我的集线器在主应用程序中,那么我可以使用登录用户的Context.User,维护一个字典,并在连接和断开连接事件时更新它们 但作为一个跨域连接,我没有Context.User,也无法知道该连接ID属于谁。我在这里迷路了Signalr 信令器跨域连接-连接连接Id';与用户的互动,signalr,signalr-hub,signalr.client,Signalr,Signalr Hub,Signalr.client,我在一个单独的域上托管我的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);
}
}