我是signalR的新手,阅读API并玩弄它。对Hub及其Context有点困惑。
也就是说,Hub.Context
不是HubContext
。
HubContext
我可以从GlobalHost.ConnectionManager.GetHubContext<THub>()
和Hub.Context
给了我一个HubCallerContext
,我不知道该如何使用。
他们的关系是什么?如何获得HubContext from Hub
或Hub from HubContext
?
答案 0 :(得分:8)
命名不佳的结果。 Hub.Context
是来自调用者的HTTP上下文(更像是请求上下文)。 HubContext
有GroupManager
和Clients
,其映射到Hub.Groups
和Hub.Clients
。
您可以添加到群组并从群集外部与客户端通话。在集线器内部,您可以获取调用者的连接ID,并获取与集线器调用关联的HTTP请求上下文。在集线器之外,您无法执行Context.Clients.Caller
或Context.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。
希望这有帮助!