上下文交换

本主题适用于 Windows Workflow Foundation 4。

上下文相关依据的是在 .NET Context Exchange Protocol Specification(.NET 上下文交换协议规范)中描述的上下文交换机制。上下文相关使用已知的上下文头或 cookie 将消息与正确的实例相关。若要使用上下文相关,必须在提供给 WorkflowServiceHost 的终结点上使用诸如 BasicHttpContextBindingWSHttpContextBindingNetTcpContextBinding 之类的基于上下文的绑定。此主题说明如何在工作流服务中将上下文相关用于消息传送活动。

使用上下文相关

如果客户端必须重复调用工作流服务,并且系统使用一个上下文绑定承载该服务,此时可以使用上下文相关。工作流服务中的 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
        }
    }
};
Ee358724.note(zh-cn,VS.100).gif注意:
请注意,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 存储中引用此上下文,并传递此上下文。