从Controller调用SignalR Core Hub方法时的连接ID

Hap*_*mad 3 c# signalr asp.net-core-2.1 asp.net-core-signalr

这是另一个问题和答案的后续行动.呼叫HubContext.Clients.CallerHubContext.Clients.Others来自控制器的影响是什么?我看到它取决于连接ID.在这种情况下它会有什么价值?

如果连接ID(以及因此CallerOthers)无效,那么(从控制器操作中)我如何获得可以与HubContext.Clients方法一起使用的连接ID(对于当前调用Web API的客户端)?

aar*_*ron 10

呼叫HubContext.Clients.CallerHubContext.Clients.Others来自控制器的影响是什么?我看到它取决于连接ID.在这种情况下它会有什么价值?

既不存在.Caller也没有.Others关于HubContext.Clients(类型的HubClients<THub>).

" 这是不可能访问那些IHubContext.Caller而且Others都依赖于知道哪个客户端调用者.当你在IHubContext是,我们不知道,有可能甚至当前的调用者,因为你可以在一个MVC控制器动作等等 "
- aspnet/SignalR#2274(评论)

(从控制器操作中)我如何获得可以与HubContext.Clients方法一起使用的连接ID(对于当前调用Web API的客户端)?

" 无法知道当前来电者是谁来自IHubContext "
- aspnet/SignalR#2274(评论)

使用组和用户是缓解这种情况的一种方法.

" 如果您有权访问发起操作的用户的用户ID,您可以使用.Users(userId)该消息向该用户的所有连接发送消息.同样,您将SignalR连接添加到组并使用.Group(groupName) "
- aspnet 发送到该组/ SignalR#2274(评论)

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

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

毂:

public string GetConnectionId()
{
    return Context.ConnectionId;
}
Run Code Online (Sandbox Code Playgroud)

客户:

hub.invoke('getConnectionId')
    .then(function (connectionId) {
        // Send the connectionId to controller
    });
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。哇,那个 Github 问题最近才被打开。看起来在我的场景中最简单的解决方案可能是将初始 WebAPI 调用转换为集线器方法。 (4认同)