长轮询是否会在每个请求中创建新的SignalR Hub?

时间:2015-04-04 00:09:01

标签: c# asp.net signalr

从SignalR的教程中我了解到Hub类与ASP WebForms页面的工作方式类似。在每个请求上创建一个新的Hub,处理请求,发送响应然后销毁。但是,我不确定我是否理解正确,它是如何与个别传输技术一起工作的。如果我错了,请纠正我,但我假设如下:

由于WebSockets创建双工通道,因此连接将持续存在,直到客户端断开连接(或连接因不同原因而中断)和客户端发出初始请求的单个Hub服务实例。

但是,在长轮询中,一旦服务器发送响应,Hub实例就会被销毁。然后SignalR客户端自动创建另一个请求(轮询的性质)。但是,此请求会在服务器上创建一个全新的Hub实例,这与为第一个请求提供服务的Hub对象完全不同。然后,第二个Hub实例处理请求,发送响应并销毁。然后客户端发送第三个请求,整个过程再次开始。

我是对还是错了?我无法在互联网上的任何地方找到答案。

1 个答案:

答案 0 :(得分:3)

每个连接不创建集线器,但是从客户端到服务器的每个相关请求(我不讨论直接在服务器端创建的集线器上下文)。您的声明“客户端发出初始请求的单个Hub服务实例”关于WebSocket是错误的。当您在客户端上启动连接并且流程成功时,会创建一个集线器来触发OnConnected事件,然后将其删除。当客户端调用服务器端方法时,将再次为每个调用创建一个新的集线器然后删除无论您使用什么传输,包括WebSocket 都是如此。创建集线器以满足物理连接本身,因此长时间轮询它不是问题,因为它与WebSocket没有区别。每个WebSocket连接或长轮询HTTP请求并不意味着创建持久性集线器。集线器是在每个逻辑连接(*)每个方法调用时创建的瞬态实例。每次触发连接事件或在集线器上调用方法时,无论使用何种传输,都会有新的实例应答。

This可能是要检查的最好的文档,但是一旦开始区分逻辑级别(SignalR事件和方法调用就在那里),物理级别(HTTP请求或WebSocket,它们不一定相关)到逻辑层面然后它应该更清楚。

您也可以自行验证,只需添加以下内容:

private readonly Guid _id = Guid.NewGuid();

到您的集线器,您会看到任何OnConnected事件以及随后的任何方法调用都会有不同的值您选择的任何传输,因此证明没有1到连接和集线器之间始终存在1种关系(这并不意味着在可能的情况下不会保留底层物理连接,例如WebSocket)。

(*)这里有一些细微之处使得这个陈述并不总是正确的,但它们与传输策略无关,所以我会跳过它们。