SignalR - HubContext和Hub.Context

时间:2013-10-03 02:46:46

标签: asp.net signalr signalr-hub

我是signalR的新手,阅读API并玩弄它。对Hub及其Context有点困惑。

也就是说,Hub.Context不是HubContext

HubContext我可以从GlobalHost.ConnectionManager.GetHubContext<THub>()

获取

Hub.Context给了我一个HubCallerContext,我不知道该如何使用。

他们的关系是什么?如何获得HubContext from HubHub from HubContext

2 个答案:

答案 0 :(得分:8)

命名不佳的结果。 Hub.Context是来自调用者的HTTP上下文(更像是请求上下文)HubContextGroupManagerClients,其映射到Hub.GroupsHub.Clients

您可以添加到群组并从群集外部与客户端通话。在集线器内部,您可以获取调用者的连接ID,并获取与集线器调用关联的HTTP请求上下文。在集线器之外,您无法执行Context.Clients.CallerContext.Clients.Others,因为当您在集线器之外时没有呼叫者。

希望能够解决问题。

答案 1 :(得分:6)

HubCallerContext是一个与当前请求相关的上下文。您将无法使用HubContext执行以下操作:

public class MyHub : Hub
{        
    public void Foo()
    {               
        // These two are equivalent
        Clients.Caller.bar();
        Clients.Client(Context.ConnectionId).bar(); // Context.ConnectionId is the client that made the request connection id
    }
}

您无法使用HubContext执行此操作的原因是您没有Clients.Caller并且您没有Context.ConnectionId。

但是,您可以使用HubCallerContext对HubContext执行所有操作。

将HubCallerContext视为请求相对的,更高级的HubContext版本。

最终,当您想要将数据发送到请求上下文之外的集线器客户端时,会使用HubContext。

希望这有帮助!