【问题标题】:Get connectionId outside of Hub, SignalR在集线器、SignalR 之外获取 connectionId
【发布时间】:2021-03-12 00:16:38
【问题描述】:

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

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

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

【问题讨论】:

    标签: asp.net-mvc signalr


    【解决方案1】:

    您可以在 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 是集线器之外的当前连接 id?只有连接这么多,时间就不对了。
    【解决方案2】:

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

    【讨论】:

    • 不是每个人都建立聊天服务器。我认为暗示的是如何获取当前客户端使用的 ConnectionId,以便可以将消息发送给该用户/会话。我想知道如何在我想发送进度消息的客户端的 MVC 操作中最好地做到这一点。有一些通过用户名缓存 ConnectionIds 的技术,但我没有看到任何体面的东西允许同一个用户拥有多个连接,这在 Web 应用程序中通常是这种情况。有什么想法吗?谢谢。
    • 您将其从客户端发送到您的 mvc 操作。它可以通过 $.connection.hub.id 在客户端上使用。
    【解决方案3】:

    这是解决方案。 您可以在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。 希望这会有所帮助。

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-14
        • 1970-01-01
        相关资源
        最近更新 更多