我在獨立的域上託管我的信號中心,並從我的主應用程序跨接到中心的域連接。當用戶登錄到主應用程序時,建立信號連接。現在,我遇到的問題是如何識別集線器內部的連接用戶。SignalR跨域連接 - 連接Id與用戶的連接
如果我的Hub在主應用程序中,那麼我可以使用已登錄用戶的Context.User並維護一個字典並在Connect和Disconnect事件中更新它們。
但作爲一個跨域連接,我沒有Context.User,也無法知道連接ID屬於誰。我迷失在這裏。
我在這裏錯過了什麼?
我在獨立的域上託管我的信號中心,並從我的主應用程序跨接到中心的域連接。當用戶登錄到主應用程序時,建立信號連接。現在,我遇到的問題是如何識別集線器內部的連接用戶。SignalR跨域連接 - 連接Id與用戶的連接
如果我的Hub在主應用程序中,那麼我可以使用已登錄用戶的Context.User並維護一個字典並在Connect和Disconnect事件中更新它們。
但作爲一個跨域連接,我沒有Context.User,也無法知道連接ID屬於誰。我迷失在這裏。
我在這裏錯過了什麼?
您應該自己保留用戶憑據和連接ID。你應該定義List<ClientsEntity>
或類似的東西。然後覆蓋onConnected
和onDisconnected
方法。正如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);
}
}
您可以在用戶登錄後爲其分配唯一的連接令牌;然後讓客戶端在查詢字符串中發送:
$.connection.hub.qs = { 'token' : id };