长轮询如何在客户端上实际调用回调函数?

5
客户端发起长轮询,调用服务器上的一个方法,并传递一个包含回调委托的 AsyncCallback 实例。当服务器异步返回给客户端时,该回调委托将被调用。在 BasicHttp WCF 中,我的理解是 AsyncCallback 参数被序列化并发送到服务器,然后由服务器进行反序列化、缓存,并最终调用它来“回复”客户端。
首先,上述说明是否正确?其次,如何在网络中间隔很远的客户端上调用 AsyncCallback 委托?

你的问题是什么? - techBeginner
2个回答

6
连接保持打开状态,因此服务器将在现有连接上响应,包括回调处理程序名称在响应中。
客户端理解消息的格式,然后可以使用来自服务器响应的数据调用适当的本地方法(基于回调处理程序)。
我通常不喜欢引用维基百科,但在这种情况下,它是对长轮询的not a bad explanation...
长轮询是传统轮询技术的一种变体,允许模拟从服务器到客户端的信息推送。使用长轮询时,客户端以类似于普通轮询的方式向服务器请求信息。但是,如果服务器没有可用于客户端的任何信息,服务器将保留该请求并等待某些信息可用。一旦信息可用(或经过适当的超时时间),将向客户端发送完整的响应。客户端通常会立即重新请求服务器的信息,因此服务器几乎总是有一个可用的等待请求,可用于响应事件中的数据。在Web / AJAX环境中,长轮询也称为Comet编程。
澄清:无需翻译。
  • 客户端向服务器发送POST请求,包括回调句柄并保持连接开放
  • 一段时间后,服务器用来自POST的回调句柄和响应数据进行响应(当您在服务器上调用AsyncCallback的方法时会发生这种情况)
  • 客户端从服务器读取响应,识别已返回的回调句柄并使用它来识别要执行的方法
  • 客户端执行由回调句柄指定的方法并传入其余的服务器响应。

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

在幕后还进行了其他检查,以确保仅调用预期的方法,并且恶意服务器不能在客户端代码中执行任何选择的方法。


好的,假设我们有一个基于REST和JSON的服务器,并带有方法void Post(AsyncCallback clientCallback)。客户端使用JSON序列化的_myClientCallback在请求体上进行POST。那么当服务器调用clientCallback()时,_myClientCallback内部的IAsyncResult委托会在客户端上执行?很抱歉这么具体和愚蠢,只是想一劳永逸地解决这个长轮询的问题。 - bytefire
我已经更新了我的答案并进行了一些澄清。如果您仍然不确定细节,请告诉我您不清楚的地方,我们可以进一步深入研究。 - Basic
将其标记为答案,因为它涵盖了原始查询。我快速研究了JSONP,这也有所帮助。现在,在.NET中,是否有标准方式将客户端回调处理程序进行JSON序列化,以便当返回长轮询时服务器发送给客户端? - bytefire
1
我不知道序列化是如何在底层处理的。一般来说,.Net 有两种处理 JSON 的方式。较旧的 DataContractJsonSerializer 和较新的 Newtonsoft(又称 JSON.Net)机制通过 Newtonsoft.JSON.JsonConvert 方法。但是,需要明确的是,被序列化的不是整个方法,而是对该方法的引用。 - Basic

4

@Basic的答案很好,但是我想写一段描述,希望对某些人更易于理解。

  1. 你的代码调用本地类中代表服务器上web方法的方法
  2. 该本地类建立与服务器的连接,并将该连接放入对象中,同时还有对传递进来的 AsyncCallback 的引用
  3. 该包含信息的对象被放入后台,并带有某种触发器,以便在收到响应时知道何时触发
  4. 与此同时,主线程被返回继续处理任何其他任务
  5. 一旦服务器响应(在长轮询的情况下,它将等待一段时间才返回假响应),则会提取对象,并使用信息调用 AsyncCallback

因此,在客户端方面真正异步的是等待响应的框架。TCP 连接和服务器处理都很标准(除了在长轮询中等待响应的情况下没有返回内容)

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


继续在上面的评论中讨论,干杯Thymine。 - bytefire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接