【发布时间】:2021-03-12 00:16:38
【问题描述】:
如何在 Hub 之外获取客户端 connectionId/clientId?.. 我已设法做到以下几点:
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
但在那个上下文对象中没有clientId 这样的东西。
【问题讨论】:
标签: asp.net-mvc signalr
如何在 Hub 之外获取客户端 connectionId/clientId?.. 我已设法做到以下几点:
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
但在那个上下文对象中没有clientId 这样的东西。
【问题讨论】:
标签: asp.net-mvc signalr
您可以在 Hub 上实现 IConnected/IDisconnect 并手动跟踪客户端(例如在数据库中),然后在需要时拉回列表。下面的例子来自SignalR Wiki
public class Status : Hub, IDisconnect, IConnected
{
public Task Disconnect()
{
return Clients.leave(Context.ConnectionId, DateTime.Now.ToString());
}
public Task Connect()
{
return Clients.joined(Context.ConnectionId, DateTime.Now.ToString());
}
public Task Reconnect(IEnumerable<string> groups)
{
return Clients.rejoined(Context.ConnectionId, DateTime.Now.ToString());
}
}
【讨论】:
为什么在全局上下文中会有一个连接 ID?它指的是哪个连接?当您获得全局上下文时,您正在访问从服务器到客户端的单向通道,并且可以通过它发送消息。由于您没有调用集线器,因此您无权访问集线器的连接 ID。如果需要使用它们,可以将它们存储在应用程序的某个位置。
【讨论】:
这是解决方案。
您可以在hub 中调用一个方法,然后您可以从那里返回connection ID。
在控制器中
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
MyHub _connectedHub= new MyHub();
var connectedUserID = _connectedHub.GetConnectionID();
在中心
public string GetConnectionID()
{
return "Your Connection ID as String" //This can be stored in a list or retrieved in any other method
}
您将在 connectedUserID 变量中获得集线器外部所需的 ID。
希望这会有所帮助。
【讨论】:
我将@davidfowl 评论更改为答案 - 您将其从客户端发送到您的 mvc 操作。它可以通过 $.connection.hub.id 在客户端上使用
$.connection.hub.start().done(function () { console.log($.connection.hub.id); });
然后用它做任何你想做的事。
【讨论】: