上下文交换
本主题适用于 Windows Workflow Foundation 4。
上下文相关依据的是在 .NET Context Exchange Protocol Specification(.NET 上下文交换协议规范)中描述的上下文交换机制。上下文相关使用已知的上下文头或 cookie 将消息与正确的实例相关。若要使用上下文相关,必须在提供给 WorkflowServiceHost 的终结点上使用诸如 BasicHttpContextBinding、WSHttpContextBinding 或 NetTcpContextBinding 之类的基于上下文的绑定。此主题说明如何在工作流服务中将上下文相关用于消息传送活动。
使用上下文相关
如果客户端必须重复调用工作流服务,并且系统使用一个上下文绑定承载该服务,此时可以使用上下文相关。工作流服务中的 Receive/SendReply 对可初始化这种类型的相关。上下文将与答复一起发送回客户端,客户端随后将此上下文附加到对服务的后续调用。
在工作流服务中配置上下文相关
使用与答复初始传入消息的 SendReply 活动相关联的 ContextCorrelationInitializer 初始化上下文相关。在下面的实例中,配置了 SendReply 来初始化上下文相关。
Variable<string> Item = new Variable<string>();
Variable<CorrelationHandle> OrderHandle = new Variable<CorrelationHandle>();
Receive StartOrder = new Receive
{
CanCreateInstance = true,
ServiceContractName = "IOrderService",
OperationName = "StartOrder"
};
SendReply ReplyToStartOrder = new SendReply
{
Request = StartOrder,
CorrelationInitializers =
{
new ContextCorrelationInitializer
{
CorrelationHandle = OrderHandle
}
}
};
注意: |
---|
请注意,Receive/SendReply 对使用的是由 WorkflowServiceHost 的隐式 CorrelationHandle 管理提供的默认请求-答复相关。有关更多信息,请参见请求-答复. |
工作流服务中的后续 Receive 活动可以引用由上一示例中的 SendReply 初始化的 CorrelationHandle。
Receive AddItem = new Receive
{
ServiceContractName = "IOrderService",
OperationName = "AddItem",
CorrelatesWith = OrderHandle
};
随后,在 WorkflowServiceHost 上配置终结点以使用基于上下文的绑定,如 BasicHttpContextBinding。
<endpoint
contract=”IOrderContract”
binding = “basicHttpContextBinding”
address=”https://localhost:8080/OrderService” />
在工作流客户端中配置上下文相关
客户端为其他工作流时,也必须在客户端配置上下文相关。在客户端工作流上,必须使用 ContextCorrelationInitializer 来配置对工作流服务进行初始调用的 Send/ReceiveReply 对的 ReceiveReply。
Variable<CorrelationHandle> cchandle = new Variable<CorrelationHandle>();
Send request = new Send
{
// Activity configuration omitted.
};
ReceiveReply reply = new ReceiveReply
{
Request = request,
CorrelationInitializers =
{
new ContextCorrelationInitializer
{
CorrelationHandle = cchandle
}
}
};
初始化相关后,后续 Send 活动即可使用 CorrelationHandle 调用同一服务实例上的方法。
Send request2 = new Send
{
CorrelatesWith = cchandle,
// Remaining activity configuration omitted.
};
请注意,在上面这些示例中,已显式配置上下文相关。如果客户端工作流也未在 WorkflowServiceHost 中承载,除非活动都包含在一个 CorrelationScope 活动中,否则必须显式配置相关。
如果调用工作流服务的客户端不是工作流,则只要客户端将首次调用工作流服务时返回的上下文显式传递回去,它仍然可以进行重复调用。默认情况下,通过添加服务而生成的代理在 Visual Studio 2010 存储中引用此上下文,并传递此上下文。