在工作階段中群組佇列訊息
Windows Communication Foundation (WCF) 會提供工作階段,讓您將一系列相關的訊息群組在一起,以便透過單一接收應用程式進行處理。本身是工作階段一部分的訊息,也必須是屬於相同的交易。由於所有訊息都屬於相同的交易,所以如果有任何一個訊息無法進行處理,就會回復整個工作階段。工作階段對於寄不出的信件佇列與有害佇列,會採取類似行為。針對工作階段在佇列繫結上設定的存留時間 (TTL) 屬性會完整地套用到工作階段。如果工作階段中只有部分訊息在 TTL 到期之前傳送出去,則整個工作階段將置於寄不出的信件佇列中。同樣地,當工作階段中的訊息無法從應用程式佇列傳送到應用程式的話,則整個工作階段將置於有害佇列 (如果有的話)。
訊息群組範例
舉例來說,當您將訂單處理應用程式實作為 WCF 服務時,會發現群組訊息做法非常有用。例如,用戶端將訂單提交給包含一些項目的應用程式。接著,用戶端針對每個項目向服務進行呼叫,以便分別傳送每個訊息。情況可能變成:伺服器 A 收到第一個項目,而伺服器 B 則收到第二個項目。每次新增一個項目時,負責處理該項目的伺服器就必須找到適當的順序,並將該項目附加上去,如此一來就會變得很沒效率。就算只有一部伺服器在處理所有要求,效率仍舊可能不彰,因為伺服器必須追蹤目前正在處理的所有訂單,並判斷新增的項目歸屬哪個訂單。將單一訂單上的所有要求加以群組可大幅簡化此類應用程式的實作。用戶端應用程式將單一訂單的所有項目傳送到工作階段,這樣一來,當服務處理訂單時,就會立即處理整個工作階段。\
程序
若要設定服務合約使用工作階段
定義需要工作階段的服務合約。若要這麼做,請使用 OperationContractAttribute 屬性並指定:
SessionMode=SessionMode.Required
將合約中的作業標示為單向,因為這些方法無法傳回任何東西。若要這麼做,請使用 OperationContractAttribute 屬性並指定:
[OperationContract(IsOneWay = true)]
實作服務合約並指定 PerSession 的 InstanceContextMode。這樣只會針對每個工作階段產生服務一次。
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
每個服務作業都需要一筆交易。請使用 OperationBehaviorAttribute 屬性來加以指定。完成交易的作業應該同時將 TransactionAutoComplete 設為 true。
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
設定使用系統提供之 NetProfileMsmqBinding 繫結的端點。
使用 System.Messaging 來建立交易式佇列。您也可以使用訊息佇列 (MSMQ) 或 MMC 來建立佇列。如果您要這麼做,請建立交易式佇列。
請使用 ServiceHost 來建立服務的服務主機。
開啟服務主機來提供服務。
關閉服務主機。
若要設定用戶端
建立交易範圍以寫入交易式佇列。
使用 ServiceModel Metadata Utility Tool (Svcutil.exe) 工具來建立 WCF 用戶端。
下訂單。
關閉 WCF 用戶端。
範例
描述
下列範例提供 IProcessOrder 服務以及使用此服務之用戶端的程式碼。它說明 WCF 如何使用佇列工作階段來提供群組行為。