使用 HTTP、TCP 或命名管道的异步方案

本主题介绍不同异步请求/回复方案的活动和传输,以及使用 HTTP、TCP 或命名管道的多线程请求。

未发生错误的异步请求/答复

本部分介绍具有多线程客户端的异步请求/回复方案的活动和传输。

beginCall 返回时,调用方活动终止,随后 endCall 返回。 如果调用了回调函数,回调函数将返回。

beginCall 返回、endCall 返回,或者当回调返回(如果从被调用的活动中调用回调)时,被调用的活动将终止。

不执行回调的异步客户端

在使用 HTTP 的两端启用传播

没有回调的异步客户端,其中的 propagateActivity 在两端都设置为 true。

如果 propagateActivity=true,则 ProcessMessage 指示要传输到哪个 ProcessAction 活动。

对于基于 HTTP 的场景,会在发送的第一条消息上调用 ReceiveBytes 方法,并且在请求的整个生命周期内保持存在。

在使用 HTTP 的任意一端上禁用传播

如果任意一端的 propagateActivity=false,则 ProcessMessage 不会指示要传输到哪个 ProcessAction 活动。 因此,将调用具有新 ID 的新临时 ProcessAction 活动。 当异步响应与 ServiceModel 代码中的请求匹配时,可以从本地上下文中检索活动 ID。 可以传送到具有该 ID 的实际 ProcessAction 活动。

没有回调的异步客户端,其中的 propagateActivity 在任意一端设置为 false。

对于基于 HTTP 的场景,会在发送的第一条消息上调用 ReceiveBytes 方法,并且在请求的整个生命周期内保持存在。

当调用方或被调用方是propagateActivity=false时,且响应消息不包含 Action 标头,会在异步客户端上创建一个过程操作活动。

在使用 TCP 或命名管道的两端启用传播

没有回调的异步客户端,其中的 propagateActivity 在两端都设置为 true,使用命名管道/TCP。

对于基于 Named-Pipe 或 TCP 的方案,ReceiveBytes 会在客户端打开时调用,并会在连接的整个生命周期内保持活跃。

与第一个图像类似,如果满足propagateActivity=true条件,ProcessMessage 指示要转移到哪个 ProcessAction 活动。

在使用 TCP 或命名管道的任意一端上禁用传播

对于基于 Named-Pipe 或 TCP 的方案,ReceiveBytes 会在客户端打开时调用,并会在连接的整个生命周期内保持活跃。

与第二个图类似,如果任意一端的 propagateActivity=false,则 ProcessMessage 不会指示要传输到哪个 ProcessAction 活动。 因此,将调用具有新 ID 的新临时 ProcessAction 活动。 当异步响应与 ServiceModel 代码中的请求匹配时,可以从本地上下文中检索活动 ID。 可以传送到具有该 ID 的实际 ProcessAction 活动。

在命名管道/TCP 上的异步客户端,未使用回调且双方均将 propagateActivity 设置为 false。

执行回调的异步客户端

此方案将为回调和 endCall 添加活动 G 和 A’ 和它们的传入/传出。

本节仅演示如何在 propagateActivity=true 的情况下使用 HTTP。 但是,其他活动和传输也适用于其他情况(即, propagateActivity=false使用 TCP 或 Named-Pipe)。

当客户端调用用户代码以通知结果准备就绪时,回调将创建一个新活动(G)。 然后用户代码在回调中调用 endCall(如图 5 所示),或者在回调外部调用 endCall(图 6)。 由于不知道从中调用哪个用户活动 endCall ,因此此活动将被 A’标记。 A' 可能与 A 相同或不同。

显示一个使用回调的异步客户端,在回调中使用 endcall。

显示一个使用回调的异步客户端,在回调外部使用 endcall。

具有回调功能的异步服务器

显示一个使用回调的异步服务器。

通道堆栈在消息接收过程中回调客户端:对此处理的跟踪在 ProcessRequest 活动本身中发出。

发生错误的异步请求/答复

endCall 过程中接收到错误消息错误。 否则,活动和转移类似于以前的情况。

发生错误或未发生错误的异步单向方案

不会将响应或错误返回到客户端。