长轮询ACTUALLY如何在客户端上调用回调?

时间:2012-11-29 15:47:13

标签: c# wcf long-polling basichttpbinding

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

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

首先,上述说明是否正确?其次,AsyncCallback如何通过网络在客户端上调用?

2 个答案:

答案 0 :(得分:6)

连接保持打开状态,以便服务器响应现有连接,包括响应中的回调处理程序名称。

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

我通常不想引用维基百科,但在这种情况下,它是长期民意调查的not a bad explanation ......

  

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

澄清

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

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

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

答案 1 :(得分:4)

@ Basic的答案非常好,但我感觉自己喜欢写一些有些人更容易理解的描述。

  1. 您的代码在本地类中调用表示服务器上的web方法的方法
  2. 该本地类与服务器建立连接,并将该连接放入对象以及对传入的AsyncCallback的引用
  3. 包含信息的对象被放入后台,其中有某种触发器以了解何时收到回复
  4. 与此同时,主线程返回进入任何想要的进程
  5. 一旦服务器响应(在长轮询的情况下,它将在返回错误响应之前等待一段时间),该对象被拉起并且AsyncCallback被调用信息
  6. 所以它真的是框架(在客户端仍然)等待作为异步部分的响应。 TCP连接和服务器处理都是标准的(除了在长轮询中没有返回的情况下等待响应)

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