共用方式為


要求-回覆

本主題僅適用於 Windows Workflow Foundation 4。

要求-回覆相互關聯會搭配 Receive/SendReply 組用來實作工作流程服務中的雙向作業,以及搭配在另一個 Web 服務中叫用雙向作業的 Send/ReceiveReply 組使用。 在 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 組活動,並且明確指定要求/回覆相互關聯。