请求-答复相关

将请求-答复相关与 Receive/SendReply 对配合使用可以在工作流服务中实现双向操作,而与 Send/ReceiveReply 对配合使用可以在其他 Web 服务中调用双向操作。 在 WCF 服务中调用双向操作时,该服务可以是传统的基于命令性代码的 Windows Communication Foundation (WCF) 服务,也可以是工作流服务。 若要使用请求-答复相关,必须使用双向绑定,例如 BasicHttpBinding。 无论是调用还是实现双向操作,相关初始化步骤都非常相似,本节涵盖了这些步骤。

在双向操作中配合使用相关和 Receive/SendReply

Receive/SendReply 对用于在工作流服务中实现双向操作。 运行时使用请求-答复相关,确保将答复调度到正确的调用方。 如果使用 WorkflowServiceHost 承载工作流(这属于工作流服务),默认相关初始化足以满足需要。 在此方案中,工作流使用 Receive/SendReply 对,并且无需执行任何特定相关配置。

Receive StartOrder = new Receive  
{  
    CanCreateInstance = true,  
    ServiceContractName = OrderContractName,  
    OperationName = "StartOrder"  
};  
  
SendReply ReplyToStartOrder = new SendReply  
{  
    Request = StartOrder,  
    Content = … // Contains the return value, if any.  
};  
  
// Construct a workflow using StartOrder and ReplyToStartOrder.  

显式初始化请求-答复相关

如果存在其他并行的双向操作,则应显式配置相关。 可通过指定 CorrelationHandleRequestReplyCorrelationInitializer,或者将 Receive/SendReply 放置到 CorrelationScope 中来完成此操作。 在此示例中,在 Receive/SendReply 对中配置请求-答复相关。

Variable<CorrelationHandle> RRHandle = new Variable<CorrelationHandle>();  
  
Receive StartOrder = new Receive  
{  
    CanCreateInstance = true,  
    ServiceContractName = OrderContractName,  
    OperationName = "StartOrder",  
    CorrelationInitializers =  
    {  
        new RequestReplyCorrelationInitializer  
        {  
            CorrelationHandle = RRHandle  
        }  
    }  
};  
  
SendReply ReplyToStartOrder = new SendReply  
{  
    Request = StartOrder,  
    Content = … // Contains the return value, if any.  
};  
  
// Construct a workflow using StartOrder and ReplyToStartOrder.  

可以使用 CorrelationScope 活动来取代显式配置关联。 CorrelationScope 向其包含的消息传递活动提供隐式 CorrelationHandle。 在此示例中,Receive/SendReply 对包含在 CorrelationScope 中。 无需执行任何显式相关配置。

Receive StartOrder = new Receive  
{  
    CanCreateInstance = true,  
    ServiceContractName = OrderContractName,  
    OperationName = "StartOrder"  
};  
  
SendReply ReplyToStartOrder = new SendReply  
{  
    Request = StartOrder,  
    Content = … // Contains the return value, if any.  
};  
  
CorrelationScope s = new CorrelationScope  
{  
    Body = new Sequence  
    {  
        Activities =
        {  
            StartOrder,  
            // Activities that create the reply.  
            ReplyToStartOrder  
        }  
    }  
};  
  
// Construct a workflow using the CorrelationScope.  

如果需要其他相关,可以使用相应消息传递活动(使用所需 CorrelationInitializers 类型)的 CorrelationInitializer 属性来配置这些相关。

在双向操作中配合使用相关和 Send/ReceiveReply

Receive 活动只能用于由 WorkflowServiceHost 托管的工作流服务,而 SendSend/ReceiveReply 对可用于必须调用 Web 服务上的方法的任何工作流。 如果使用 WorkflowServiceHost 承载工作流,将应用上一节中介绍的默认相关,否则,必须显式使用所需 CorrelationInitializerCorrelationHandle,或者使用 CorrelationScope 的隐式句柄管理来配置相关。

如果在具有双向操作的服务上使用“添加服务引用”,生成的活动将使用显式指定的请求/答复相关在内部包装 Send/ReceiveReply 对活动。