在Hub,SignalR之外获取connectionId

时间:2012-05-15 12:25:38

标签: asp.net-mvc signalr

如何在Hub之外获取客户端connectionId / clientId?..我已设法执行以下操作:

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

但是在那个上下文对象中没有clientId这样的东西。

4 个答案:

答案 0 :(得分: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());
    }
}

答案 1 :(得分:4)

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

答案 2 :(得分:1)

这是解决方案。 您可以在GET /me/drive/search(q='doc')内调用方法,然后从那里返回GET /me/drive/root:/{item-path}:/search(q='{search-text}')

在控制器中

hub

在中心

connection ID

您将在var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); MyHub _connectedHub= new MyHub(); var connectedUserID = _connectedHub.GetConnectionID(); 变量中获取集线器外部所需的ID。 希望这有助于。

答案 3 :(得分:0)

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

在客户端上获得
 $.connection.hub.start().done(function () { console.log($.connection.hub.id); });

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