【问题标题】:How does long polling ACTUALLY invoke callback on client?长轮询实际上如何在客户端调用回调?
【发布时间】:2012-11-29 15:47:13
【问题描述】:

客户端启动长轮询,调用服务器上的方法并传入AsyncCallback 的实例,其中包含回调委托,当服务器异步返回客户端时将调用该委托。

现在我对此的理解是有限的,但似乎在BasicHttp WCF 中,AsyncCallback 参数被序列化并发送到服务器,然后服务器对其进行反序列化、缓存并最终调用它以“返回”到客户。

首先,上面的解释正确吗?其次,客户端上的AsyncCallback是怎么一路跨网络调用的?

【问题讨论】:

  • 你的问题到底是什么?

标签: c# wcf long-polling basichttpbinding


【解决方案1】:

连接保持打开状态,因此服务器通过现有连接进行响应,包括响应中的回调处理程序名称。

客户端了解消息的格式,然后可以使用来自服务器响应的数据调用适当的本地方法(基于回调处理程序)。

我通常不喜欢引用维基百科,但在这种情况下,它是长轮询的not a bad explanation...

长轮询是传统轮询技术的一种变体, 允许模拟从服务器到客户端的信息推送。 通过长轮询,客户端向服务器请求信息 与普通民意调查类似的方式。但是,如果服务器没有 客户可用的任何信息,而不是发送空的 响应,服务器持有请求并等待一些信息 可用。一旦信息可用(或经过 合适的超时),一个完整的响应被发送到客户端。这 客户通常会立即从 服务器,因此服务器几乎总是有一个可用的 等待请求,它可以用来传递数据以响应 事件。在 web/AJAX 上下文中,长轮询也称为 Comet 编程。

澄清

  • 客户端向服务器发送一个 POST,包括一个回调句柄并保持连接打开
  • 一段时间后,服务器使用来自 POST 的回调句柄和响应数据进行响应(当您在服务器上调用 AsyncCallback 的方法时会发生这种情况)
  • 客户端从服务器读取响应,识别已经返回的回调句柄,并使用它来识别要执行的方法,
  • 客户端执行回调句柄指定的方法,并传入服务器响应的其余部分。

这类似于 JSONP 的工作方式(回调部分,不是长轮询),如果您熟悉的话?本质上,回调句柄只是传递给服务器,以便它可以与响应一起发回,并允许客户端调用正确的方法。

还有一些额外的检查在后台进行,以确保只调用预期的方法,并且恶意服务器不能只执行它在客户端代码中选择的任何方法。

【讨论】:

  • 好的,假设我们有一个基于 REST 和 JSON 的服务器,其方法为 void Post(AsyncCallback clientCallback)。客户端 POST 在服务器上使用 JSON 序列化的 _myClientCallback 正文。那么当服务器调用clientCallback()时,_myClientCallback里面的IAsyncResult委托会在客户端执行吗?对不起,具体而愚蠢。只是试图一劳永逸地对这些长期轮询的东西进行排序。
  • 我已经更新了我的答案并进行了一些澄清。如果您仍然不确定细节,请告诉我您不清楚的地方,我们可以进一步深入研究。
  • 标记为答案,因为它涵盖了原始查询。快速阅读了 JSONP,这也有帮助。现在,在 .NET 中,是否有标准的方式 JSON 序列化客户端回调处理程序,服务器在返回长轮询时发送给客户端?
  • 我不知道如何在后台处理序列化。一般来说,.Net 有两种处理 JSON 的方法。较旧的 DataContractJsonSerializer 和较新的 Newtonsoft(又名 JSON.Net)机制通过 Newtonsoft.JSON.JsonConvert 方法。但是,需要明确的是,序列化的不是整个方法,而是对该方法的引用。
【解决方案2】:

@Basic 的回答非常好,但我想写一个描述,希望对某些人来说更容易理解。

  1. 您的代码调用本地类中的一个方法,该类表示服务器上的 Web 方法
  2. 该本地类与服务器建立连接,并将该连接与传入的 AsyncCallback 的引用一起放入对象中
  3. 包含信息的对象被放入后台,其中包含某种触发器以了解何时收到响应
  4. 与此同时,主线程被返回以继续处理它想要的任何事情
  5. 一旦服务器响应(在长轮询的情况下,它将等待一段时间再返回错误响应)对象被拉起并使用信息调用AsyncCallback

所以实际上框架(仍然在客户端)正在等待异步部分的响应。 TCP连接和服务器处理都是标准的(除了长轮询无返回的情况下等待响应)

这应该描述任何语言的任何异步 Web 请求的基本过程,无论是长轮询、下载图像等。

【讨论】:

  • 干杯胸腺嘧啶。继续上面 cmets 中的讨论。
猜你喜欢
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多