本主题介绍不同异步请求/回复方案的活动和传输,以及使用 HTTP、TCP 或命名管道的多线程请求。
未发生错误的异步请求/答复
本部分介绍具有多线程客户端的异步请求/回复方案的活动和传输。
当 beginCall
返回时,调用方活动终止,随后 endCall
返回。 如果调用了回调函数,回调函数将返回。
当 beginCall
返回、endCall
返回,或者当回调返回(如果从被调用的活动中调用回调)时,被调用的活动将终止。
不执行回调的异步客户端
在使用 HTTP 的两端启用传播
如果 propagateActivity=true
,则 ProcessMessage 指示要传输到哪个 ProcessAction 活动。
对于基于 HTTP 的场景,会在发送的第一条消息上调用 ReceiveBytes 方法,并且在请求的整个生命周期内保持存在。
在使用 HTTP 的任意一端上禁用传播
如果任意一端的 propagateActivity=false
,则 ProcessMessage 不会指示要传输到哪个 ProcessAction 活动。 因此,将调用具有新 ID 的新临时 ProcessAction 活动。 当异步响应与 ServiceModel 代码中的请求匹配时,可以从本地上下文中检索活动 ID。 可以传送到具有该 ID 的实际 ProcessAction 活动。
对于基于 HTTP 的场景,会在发送的第一条消息上调用 ReceiveBytes 方法,并且在请求的整个生命周期内保持存在。
当调用方或被调用方是propagateActivity=false
时,且响应消息不包含 Action 标头,会在异步客户端上创建一个过程操作活动。
在使用 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 相同或不同。
具有回调功能的异步服务器
通道堆栈在消息接收过程中回调客户端:对此处理的跟踪在 ProcessRequest 活动本身中发出。
发生错误的异步请求/答复
在 endCall
过程中接收到错误消息错误。 否则,活动和转移类似于以前的情况。
发生错误或未发生错误的异步单向方案
不会将响应或错误返回到客户端。