7

如何在 Hub 之外获取客户端 connectionId/clientId?.. 我已经设法做到以下几点:

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();

但是在那个上下文对象中,没有 a 之类的东西clientId

4

4 回答 4

4

您可以在集线器上实现 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());
    }
}
于 2012-05-23T12:59:32.330 回答
4

为什么全局上下文中会有连接 ID?它指的是哪个连接?当您获得全局上下文时,您正在访问从服务器到客户端的单向通道,并且可以通过它发送消息。由于您没有调用集线器,因此您无权访问集线器的连接 ID。如果需要使用它们,可以将它们存储在应用程序的某个位置。

于 2012-06-08T16:58:52.083 回答
0

我将@davidfowl 评论更改为答案 - 您将其从客户端发送到您的 mvc 操作。它可以通过 $.connection.hub.id 在客户端上使用

 $.connection.hub.start().done(function () { console.log($.connection.hub.id); });

然后用它做任何你想做的事。

于 2021-03-11T16:16:38.450 回答
0

这是解决方案。你可以在里面调用一个方法,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。希望这可以帮助。

于 2017-08-29T07:32:06.863 回答