5

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

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

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

4

2 回答 2

6

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

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

我通常不喜欢引用维基百科,但在这种情况下,对长轮询的解释还不错......

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

澄清

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

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

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

于 2012-11-29T15:53:03.977 回答
4

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

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

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

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

于 2012-11-29T20:42:56.453 回答