代码之家  ›  专栏  ›  技术社区  ›  HappyNomad

从控制器调用信号器核心集线器方法时的连接ID

  •  10
  • HappyNomad  · 技术社区  · 6 年前

    这是对 another question and answer .打电话的效果如何 HubContext.Clients.Caller HubContext.Clients.Others 来自控制器?我看这取决于 connection ID .在这种情况下有什么价值?

    如果连接ID(因此 Caller Others )无效,那么(从控制器操作中)如何获取可用于的连接ID(用于当前调用Web API的客户端) HubContext.Clients 的方法?

    1 回复  |  直到 6 年前
        1
  •  21
  •   aaron    6 年前

    打电话的效果如何 HubContext.Clients.Caller HubContext.Clients.Others 来自控制器?我知道这取决于连接ID。在这种情况下它有什么价值?

    两者都没有 .Caller 也没有 .Others 在…上 HubContext.Clients (属于类型 HubClients<THub> )。

    “” 无法从 IHubContext Caller Others 两者都取决于知道哪个客户端是调用方。当你在IHubContext时,我们不知道,甚至可能 当前调用方,因为您可能处于MVC控制器操作中,等等。 “”
    –俬 aspnet/SignalR#2274 (comment)

    (从控制器操作中)如何获取可用于的连接ID(用于当前调用Web API的客户端) HubContext。客户 的方法?

    “” 无法从IHubContext中知道当前调用方是谁 “”
    –俬 aspnet/SignalR#2274 (comment)

    使用组和用户是缓解这一问题的一种方法。

    “” 如果您有权访问发起操作的用户的用户ID,则可以使用 .Users(userId) 向该用户的所有连接发送消息。类似地,可以将信号器连接添加到组中,并使用 .Group(groupName) “”
    –俬 aspnet/SignalR#2274 (comment)

    或者,在客户端获取连接ID。

    您可以在调用API的客户端上获取连接ID,然后将其发送给控制器。

    集线器:

    public string GetConnectionId()
    {
        return Context.ConnectionId;
    }
    

    客户:

    hub.invoke('getConnectionId')
        .then(function (connectionId) {
            // Send the connectionId to controller
        });