【问题标题】:SignalR - HubContext and Hub.ContextSignalR - HubContext 和 Hub.Context
【发布时间】:2013-10-03 02:46:46
【问题描述】:

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

也就是说,Hub.Context 不是HubContext

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

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

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

【问题讨论】:

    标签: asp.net signalr signalr-hub


    【解决方案1】:

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

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

    希望能解决问题。

    【讨论】:

    • 为什么 SignalR 中似乎没有 HttpContext.Current 等效项?我在 WebForms 和 Web API 中构建了很多利用这一点的代码,但是现在我将 SignalR 添加到组合中,看起来我必须更改所有内部 API 以接受 Hub.Context。我有这个权利吗?
    【解决方案2】:

    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。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      • 2018-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多