5

我是 signalR 的新手,我正在阅读 API 并使用它。对集线器及其上下文有点困惑。

也就是说,Hub.Context不是HubContext

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

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

他们是什么关系?我怎样才能得到HubContext from HubHub from HubContext

4

2 回答 2

8

命名不当的结果。Hub.Context是来自调用者的 HTTP 上下文(更像是请求上下文)。有HubContext和映射到GroupManager和。ClientsHub.GroupsHub.Clients

您可以添加到群组并从集线器外部与客户交谈。在集线器内部,您可以获取调用者的连接 ID 并获取与集线器调用关联的 HTTP 请求上下文。在集线器之外,您不能这样做,Context.Clients.Caller或者Context.Clients.Others因为当您在集线器之外时没有呼叫者。

希望这能说明问题。

于 2013-10-03T02:56:30.843 回答
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。

希望这可以帮助!

于 2013-10-03T02:58:57.390 回答