共用方式為


支援的訊息交換案例

工作流程服務支援在 Windows Communication Foundation (WCF) 中所定義的訊息交換案例之子集。 兩個所支援的案例是單向傳送以及要求/回應。 在單向傳送案例中,用戶端在呼叫工作流程服務上的作業時,不會期待有回應。 它只是呼叫作業,並繼續進行剩下的執行作業。 在要求/回應案例中,用戶端會期待來自工作流程服務的回應,並會封鎖主要執行緒,直到收到回應為止。 如這些案例中所述,用戶端會以工作流程服務啟始所有訊息交換。

雙工通訊可以兩種方式來達成。 第一個方法是使用像一般 WCF 服務的雙工合約來建立工作階段 ID (Session ID),以供非同步通訊使用。 但可惜的是,由於工作階段 ID 是直接繫結至雙工通道,因此只要通道毀損,就無法使用工作階段 ID 做為在用戶端和服務之間建立內容的方法。 第二個啟用雙工通訊的方法就是透過使用相互關聯的合約來透過獨立通道通訊。 這些合約會在其初始作業叫用中傳遞內容 ID 資訊,作業狀態會像任何其他工作流程服務一樣的予以保存。 透過使用相互關聯的單向合約,內容 ID 會存放在應用程式層中,所以如果重新啟動用戶端或服務,它們會從其最後的保存狀態開始繼續。 這是工作流程服務慣用的雙工通訊方法。

最佳做法是,您應先執行一個與服務同步的要求/回應作業,再進行非同步通訊。 這樣的交換將允許用戶端和服務建立可供未來作業叫用使用的內容。

內容交換

本章節說明工作流程和長期服務如何使用內容將服務和用戶端之間的訊息相互關聯。 在初始要求/回應作業後,用戶端會接收來自服務的內容,並在訊息交換的存留期期間,在所有未來的訊息上提供相同的內容給服務。 內容對於用戶端而言是不透明的,而且只是為了維護所建立之訊息交換與指定之服務執行個體間的通訊而提供。 在建立內容後,只有從該服務傳入的訊息才能修改該內容。

注意

在雙工案例中,服務會將內容做為內容標頭傳回到用戶端,做為從服務傳送到用戶端之第一個訊息的一部分,不一定會做為對用戶端第一個要求的回應。

在服務端,通道的執行個體負責轉換用戶端提供的內容,將內容從傳入訊息上 SOAP 標頭的形式轉換為 ContextMessageProperty 型別。 接著 ContextMessageProperty 可供應用程式層或堆疊中位於上方的通道使用。 服務端通道也允許應用程式層指定要傳回至用戶端的新內容值。

透過在應用程式層維護這個內容,原始通道會被拆除,新通道會建立。 雖然內容交換機制是由通道提供的,但實際內容是由應用程式層提供與修復的 (在用戶端與服務上都是)。

對於使用 HTTP 傳輸的服務端點,以及同意使用 HTTP Cookie 的用戶端而言,可使用 HttpCookie 機制來交換應用程式內容。 內容交換通訊協定可讓用戶端通道接受由服務所提供的內容,並將它套用至所有後續的要求,如此服務便可接收在同一個用戶端通道執行個體上傳送的要求。 內容交換通訊協定也提供由 HTTP Cookie 在傳輸層所提供之功能的 SOAP 對等項目。

注意

若用戶端為工作流程架構且使用 SendActivity 活動與長期服務或工作流程服務通訊,則用戶端必須使用包含 ContextBindingElement 的繫結來交換用戶端和服務之間的內容,或提供其他與 ContextMessageProperty 整合的相互關聯通道。

SOAP 標頭是 wsc:Context SOAP 標頭,用於表示內容資訊。 內容標頭結構描述允許任意數量的子項目,每一個都有字串內容。 這可讓表示內容的對應訊息屬性使用合適的字典,而後者會將 XML 限定名稱 (wsc:Context 標頭中的子項目名稱和命名空間) 對應至字串值 (wsc:Context 標頭中的子項目文字值)。 因此,當繫結提供訊息保護功能時,wsc:Context 標頭必須在 SOAP 或傳輸層經過數位簽署。

取得和設定內容

在上一節中描述的 ContextMessageProperty 是訊息屬性,用於在用戶端或服務端上的應用程式層和通道層之間溝通內容。 如果內容是在通道層建立的,則用戶端與服務上的所有傳入訊息都擁有這個由內容通道所附加的屬性。 如果內容是在應用程式層附加到用戶端或服務上的傳出訊息,則存放在通道層上的內容會被 ContextMessageProperty 表示的內容取代。

除了可用於用戶端或服務端上的 ContextMessageProperty 之外,在用戶端上,還可取得目前的內容或者使用 IContextManager 在通道執行個體上設定新的內容,如下列範例所示:

IDictionary<XmlQualifiedName, string> context;
IContextManager cm = ClientProxy.InnerChannel.GetProperty<IContextManager>();
if (cm != null)
    context = cm.GetContext();
IContextManager cm = ClientProxy.InnerChannel.GetProperty<IContextManager>();
if (cm != null)
    context = cm.SetContext();

注意

ClientProxy 是一個由 svcutil 產生 Proxy 類別的執行個體以在服務上叫用作業的範例。

請參閱

概念

工作流程服務撰寫樣式

其他資源

建立工作流程服務和長期服務

Footer image

Copyright © 2007 by Microsoft Corporation. All rights reserved.