傳訊活動允許工作流程傳送和接收 WCF 訊息。 藉由將傳訊活動新增至工作流程,您可以建立任何任意複雜訊息交換模式(MEP)的模型。
訊息交換模式
有三種基本訊息交換模式:
Datagram - 使用數據報 MEP 時,用戶端會將訊息傳送至服務,但服務不會回應。 這有時稱為「發射後不需操心」。 火災和忘記交換是需要成功傳遞頻外確認的交換。 訊息可能會在傳輸中遺失,且永遠不會到達服務。 如果用戶端成功傳送訊息,則不保證服務已收到訊息。 資料包是傳訊的基礎構建模組,因為您可以在其上構建自己的 MEP。
Request-Response - 使用要求-回應 MEP 時,用戶端會將訊息傳送至服務,服務會執行必要的處理,然後將回應傳回給用戶端。 此模式包含要求與回應配對。 要求回應呼叫的範例包括遠端過程調用 (RPC) 和瀏覽器 GET 要求。 此模式也稱為半雙工。
雙工 - 使用雙工 MEP 時,用戶端和服務可以依任何順序傳送訊息給彼此。 雙工 MEP 就像電話交談一樣,其中所說的每個字都是一則訊息。
傳訊活動可讓您實作上述任何基本 MEP,以及任何任意複雜的 MEP。
傳訊活動
.NET Framework 4.6.1 會定義下列傳訊活動:
SendReply - 使用 SendReply 活動來將回應發送給已接收到的訊息。 實作要求/回復 MEP 時,工作流程服務會使用此活動。
ReceiveReply - 使用 ReceiveReply 活動來接收回復訊息。 實作要求/回復 MEP 時,工作流程服務用戶端會使用此活動。
傳訊活動和訊息交換模式
數據報 MEP 牽涉到用戶端傳送訊息,以及接收訊息的服務。 如果用戶端是工作流程,請使用 Send 活動來傳送訊息。 若要在工作流程中接收該訊息,請使用 Receive 活動。
Send和Receive活動各自有一個名為Content的屬性。 這個屬性包含要傳送或接收的數據。 實作要求-回應訊息交換模式(MEP)時,用戶端和服務都會使用成對的活動。 用戶端會使用 Send 活動來傳送訊息和活動 ReceiveReply ,以接收來自服務的回應。 這兩個活動會由 Request 屬性彼此關聯。 這個屬性會設定為 Send 傳送原始訊息的活動。 服務也會使用一對相關聯的活動: Receive 和 SendReply。 這兩個活動是由 Request 屬性相關聯。 此屬性已設定為接收原始訊息的Receive活動。
ReceiveReply和 SendReply 活動,例如 Send 和 Receive 可讓您傳送Message實例或訊息合約類型。
因為工作流程的長時間執行特性,保持雙向通訊模式以支援長時間交談非常重要。 為了支持長時間進行的對話,啟動對話的客戶端必須提供服務一個選擇,以便在資料可用時稍後應要求回呼。 例如,提交的採購單需要經理的批准,但可能一天、一週,甚至一年內都不會得到處理;管理採購單核准的工作流程必須在得到核准後才能繼續。 在工作流程中使用關聯來支援這種雙工通訊模式。 若要實作雙工模式,請使用 Send 和 Receive 活動。 在Receive活動中,使用CorrelationHandle初始化關聯。 在 Send 活動集上,將關聯句柄設為 CorrelatesWith 屬性值。 如需詳細資訊,請參閱 Durable Duplex。
備註
工作流程通過回呼關聯性實現雙工(Durable Duplex)旨在用於長時間持續的對話。 這與具有回呼合約的 WCF 雙工不同,交談是短時間運行的(即通道的生命週期)。
訊息格式設定和傳訊活動
Receive和 ReceiveReply 活動具有名為Content的屬性。 這個屬性的類型為 ReceiveContent ,表示 Receive 或 ReceiveReply 活動接收的數據。 .NET Framework 定義兩個稱為 ReceiveMessageContent 的相關類別,這 ReceiveParametersContent 兩個類別都是衍生自 ReceiveContent。 將 Receive 或 ReceiveReply 活動的 Content 屬性設定為下列其中一種類型的實例,以將數據接收至工作流程服務。 要使用的類型取決於活動接收的數據類型。 如果活動收到 Message 物件或訊息合約類型,請使用 ReceiveMessageContent。 如果活動收到一組可串行化的數據合約或 XML 類型,請使用 ReceiveParametersContent。
ReceiveParametersContent 可讓您傳送多個參數,而 ReceiveMessageContent 只允許您傳送一個物件、訊息(或訊息合約類型)。
備註
ReceiveMessageContent 也可以與可串行化的單一數據合約或 XML 類型搭配使用。 使用 ReceiveParametersContent 搭配單一參數和直接傳遞至 ReceiveMessageContent 的對象之間的差異是連線格式。 參數的內容會包裝在對應至作業名稱的 XML 元素中,而且串行化物件會使用參數名稱包裝在 XML 元素中(例如 , <Echo><msg>Hello, World</msg></Echo>。 訊息內容不會以作業名稱包裝。 相反地,序列化物件會使用 XML 限定的型別名稱(例如,<string>Hello, World</string>)放置在 XML 元素內。
Send和 SendReply 活動也有名為Content的屬性。 這個屬性的類型為 SendContent ,代表 Send 或 SendReply 活動傳送的數據。 .NET Framework 定義兩種稱為 SendMessageContent 的相關型別,兩 SendParametersContent 種類型都是衍生自 SendContent。 將 Send 或 SendReply 活動的 Content 屬性設定為下列其中一種類型的實例,以從工作流程服務傳送數據。 要使用的類型取決於活動傳送的數據類型。 如果活動傳送 Message 物件或訊息合約類型,請使用 SendMessageContent。 如果活動傳送資料合約類型,請使用 SendParametersContent。
SendParametersContent 可讓您傳送多個參數,而 SendMessageContent 只允許您傳送一個物件、訊息(或訊息合約類型)。
以命令方式使用傳訊活動進行程式設計時,您可以使用泛型 InArgument<T> 和 OutArgument<T> 將指定給 Send、SendReply、Receive 和 ReceiveReply 活動的訊息或參數屬性的物件包裝起來。 使用 InArgument<T> 於 Send 和 SendReply 活動,以及使用 OutArgument<T> 於 Receive 和 ReceiveReply 活動。
In 自變數會與傳送活動搭配使用,因為數據會傳遞至活動。
Out 自變數會與接收活動搭配使用,因為數據會從活動傳出,如下列範例所示。
Receive reserveSeat = new Receive
{
...
Content = new ReceiveParametersContent
{
Parameters =
{
{ "ReservationInfo", new OutArgument<ReservationRequest>(reservationInfo) }
}
}
};
SendReply reserveSeat = new SendReply
{
...
Request = reserveSeat,
Content = new SendParametersContent
{
Parameters =
{
{ "ReservationId", new InArgument<string>(reservationId) }
}
},
};
實作定義傳回 void 的要求/回應作業的工作流程服務時,您必須實例化SendReply活動,並將Content屬性設定為SendMessageContent或SendParametersContent其中一個內容類型的空白實例,如下例所示。
Receive rcv = new Receive()
{
ServiceContractName = "IService",
OperationName = "NullReturningContract",
Content = new ReceiveParametersContent( new Dictionary<string, OutArgument>() { { "message", new OutArgument<string>() } } )
};
SendReply sr = new SendReply()
{
Request = rcv
Content = new SendParametersContent();
};
新增服務引用
從工作流程應用程式呼叫工作流程服務時,Visual Studio 2012 會產生自定義傳訊活動,以包含用於要求/回復 MEP 的一般活動 Send 和 ReceiveReply。 若要使用此功能,請以滑鼠右鍵按兩下Visual Studio中的用戶端專案,然後選取[ 新增>服務參考]。 在位址方塊中輸入服務的基地址,然後按兩下 [Go]。 可用的服務會顯示在 [ 服務: ] 方塊中。 展開服務節點以顯示所支援的合約。 選取您想要呼叫的合約,並在 [作業] 方塊中顯示可用的 作業 清單。 然後,您可以指定所產生活動的命名空間,然後按兩下 [ 確定]。 接著,您會看到一個對話框,指出作業已順利完成,且產生的自定義活動在您重建項目之後會位於工具箱中。 服務合約上定義的每項作業都有一個活動。 重建項目之後,您可以將自定義活動拖放到您的工作流程,並在屬性視窗中設定任何必要的屬性。
傳訊活動範本
為了更輕鬆地在用戶端和服務上設定要求/回應 MEP,Visual Studio 2012 提供兩個傳訊活動範本。
System.ServiceModel.Activities.Design.ReceiveAndSendReply 用於服務端,System.ServiceModel.Activities.Design.SendAndReceiveReply 用於客戶端。 在這兩種情況下,範本都會將適當的傳訊活動新增至您的工作流程。 在服務過程中,系統會新增System.ServiceModel.Activities.Design.ReceiveAndSendReply活動,然後再新增Receive活動,再接著SendReply活動。 屬性 Request 會自動設定為 Receive 活動。 在客戶端上,System.ServiceModel.Activities.Design.SendAndReceiveReply 新增 Send 活動,然後接著 ReceiveReply。 屬性 Request 會自動設定為 Send 活動。 若要使用這些範本,只要將適當的範本拖放到您的工作流程即可。
傳訊活動和交易
在觸發工作流程服務時,您可能希望將交易傳遞至服務操作。 若要這樣做,請將 Receive 活動放在 TransactedReceiveScope 活動中。 活動 TransactedReceiveScope 包含 Receive 活動和主體。 流向服務的交易在TransactedReceiveScope主體執行過程中保持不變。 當執行程序完成時,交易就會完成。 如需工作流程和交易的詳細資訊,請參閱 工作流程交易。