客户端启动长轮询,在服务器上调用一个方法,并传入一个AsyncCallback
实例,该实例包含回调委托,当服务器异步返回客户端时将调用该回调委托。
现在我对此的理解是有限的,但在BasicHttp
WCF中,AsyncCallback
参数似乎是串行化的,并发送到服务器,然后服务器将其解串行化、缓存并最终调用它"返回"到客户端。
首先,以上解释是否正确?其次,AsyncCallback
是如何在客户端上通过网络调用的?
连接保持打开状态,以便服务器通过现有连接进行响应,包括响应中的回调处理程序名称。
客户端了解消息的格式,然后可以使用服务器响应中的数据调用适当的本地方法(基于回调处理程序)。
我通常不喜欢引用维基百科,但在这种情况下,这对长期民意调查的解释还不错。。。
长轮询是传统轮询技术的变体允许模拟从服务器到客户端的信息推送。通过长轮询,客户端在类似于正常的民意调查。但是,如果服务器没有客户端可用的任何信息,而不是发送一个空的响应,服务器保留请求并等待一些信息可用。一旦信息可用(或在适当的超时),则向客户端发送完整的响应。这个客户端通常会立即向服务器,这样服务器几乎总是有一个可用的等待请求,它可以用来传递数据以响应事件在web/AAJAX上下文中,长轮询也称为Comet编程。
澄清
- 客户端向服务器发送POST,包括一个回调句柄,并保持连接打开
- 一段时间后,服务器将使用POST的回调句柄和响应数据进行响应(当您在服务器上调用
AsyncCallback
的方法时会发生这种情况) - 客户端从服务器读取响应,识别已返回的回调句柄,并使用该句柄来识别要执行的方法
- 客户端执行回调句柄指定的方法,并传入服务器响应的其余部分
这类似于JSONP的工作方式(回调部分,不是长轮询),如果你熟悉的话?从本质上讲,回调句柄只传递给服务器,这样它就可以与响应一起发送回来,并允许客户端调用正确的方法。
还有一些额外的检查正在进行,以确保只调用预期的方法,并且恶意服务器不能只执行它在客户端代码中选择的任何方法。
@Basic的答案很好,但我想写一篇描述,希望对一些人来说更容易理解。
- 您的代码调用本地类中的一个方法,该方法表示服务器上的Web方法
- 该本地类与服务器建立连接,并将该连接与传入的
AsyncCallback
的引用一起放入对象中 - 包含信息的对象被放在后台,其中有某种触发器,可以知道何时收到响应
- 与此同时,主线程被返回以继续处理它想要的任何内容
- 一旦服务器做出响应(在长时间轮询的情况下,它将等待一段时间,然后返回错误响应),就会拉起对象,并使用信息调用
AsyncCallback
因此,它实际上是框架(仍在客户端)在等待异步部分的响应。TCP连接和服务器处理都是标准的(除了在长时间轮询没有返回的情况下等待响应)
这应该描述任何语言的异步web请求的基本过程,无论是长轮询、下载图像等。