共用方式為


要求-回覆相互關聯

Request-reply 相互關聯會搭配 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 內的方式達成。 在此範例中,request-reply 相互關聯會在 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 組活動,並且明確指定 Request/Reply 相互關聯。