WCF響應服務基本應用技巧分享
WCF中有很多比較有用的應用技巧,需要我們在不斷的學習和實踐中去積累經驗,來達到一個熟練操作的程度。在這里我們就先為大家詳細介紹一下有關WCF響應服務的一些基本應用技術,希望能給大家帶來一些幫助。#t#
到目前為止,我們所介紹的排隊調用的編程模型是單側的:客戶端向隊列發布單向消息,再由服務處理該消息。如果排隊的操作真的就是單向調用,那么這種模型足以滿足要求。然而,排隊服務有時候需要反過來向其客戶端報告調用的結果、返回的結果,甚至是錯誤。但在默認情況下,這是無法實現的。Windows Communication Foundation 將排隊調用與單向調用等同起來,而單向調用在本質上是禁止任何此類響應的。此外,排隊服務(及其客戶端)可能未處于連接狀態。如果客戶端發布對未連接服務的排隊調用,則當服務最終獲得并處理這些消息時,可能不會有客戶端來接收值,因為客戶端可能早已離線了。這一問題的解決方案是讓服務將報告返回給客戶端所提供的排隊服務。我將此類服務稱作WCF響應服務。
響應服務就是系統中的另一個排隊服務。它同樣可能與客戶端斷開連接并由單獨的進程或單獨的計算機進行托管,或者它也可能共享客戶端的進程。如果響應服務共享客戶端的進程,則當客戶端啟動時,響應服務即開始處理排隊的響應。將響應服務由獨立于客戶端的進程(甚至是計算機)托管有助于進一步將響應服務的生存期與使用該響應服務的客戶端相分離。
設計WCF響應服務合約
就如使用任何 Windows Communication Foundation 服務一樣,客戶端和服務需要預先商定響應合約及其適用對象(例如返回的值和錯誤信息,或僅僅是返回的值)。請注意,您也可將響應服務拆分為兩個服務,一個用于響應結果,另一個用于響應錯誤。例如,假定有如下由排隊 MyCalculator 服務所實現的 ICalculator 合約:
- [ServiceContract]
- interface ICalculator
- {
- [OperationContract(IsOneWay = true)]
- void Add(int number1,int number2);
- ... //更多操作
- }
- [ServiceBehavior(InstanceContextModeInstanceContextMode =
- InstanceContextMode.PerCall)]
- class MyCalculator : ICalculator {...}
要求 MyCalculator 服務以計算結果來響應客戶端并報告所有錯誤。計算結果為整數形式,錯誤以 Windows Communication Foundation ExceptionDetail 數據合約形式表示。對于響應服務,可按下列方式定義 ICalculatorResponse 合約:
- [ServiceContract]
- interface ICalculatorResponse
- {
- [OperationContract(IsOneWay = true)]
- void OnAddCompleted(int result,ExceptionDetail error);
- }
支持 ICalculatorResponse 的WCF響應服務需要檢查返回的錯誤信息,在方法結束時通知客戶端應用程序、用戶或應用程序管理員,并將結果提供給相關方。下面是一個支持 IcalculatorResponse 的簡單響應服務:
- [ServiceBehavior(InstanceContextModeInstanceContextMode =
InstanceContextMode.PerCall)]- class MyCalculatorResponse : ICalculatorResponse
- {
- [OperationBehavior(TransactionScopeRequired = true)]
- public void OnAddCompleted(int result,ExceptionDetail error)
- {
- MessageBox.Show("結果 = " + result,"MyCalculatorResponse");
- if(error != null)
- {
- //處理錯誤
- }
- }
- }
實現 MyCalculator 和 MyCalculatorResponse 會直接引出兩個問題。***個問題是同一響應服務可能會被用于處理多個排隊服務上多個調用的響應(或完成),而 MyCalculatorResponse(更重要的是其所服務的客戶端)無法區分這些響應。這一問題的解決方案是讓發出原始排隊調用的客戶端向該調用分配某個***的 ID 作為標記。排隊服務 MyCalculator 需要將該 ID 傳遞給 MyCalculatorResponse,使其能夠應用與該 ID 相關的某種自定義邏輯。
第二個問題是排隊服務如何發現WCF響應服務的地址。與雙向回調不同的是,Windows Communication Foundation 內部并不支持將響應服務引用傳遞給服務。而將該地址放入服務主機配置文件中(客戶端一節中)并不是明智之舉,因為同一排隊服務可能會被多個客戶端調用,而每個客戶端都有其自身專用的響應服務和地址。
一種可能的解決方案是將客戶端所管理的 ID 和所需的響應服務地址作為參數基于排隊服務合約明確傳遞給每個操作:
- [ServiceContract]
- interface ICalculator
- {
- [OperationContract(IsOneWay = true)]
- void Add(int number1,int number2,
- string responseAddress,string methodID);
- }
同樣,排隊服務也可以將WCF響應服務的方法 ID 作為參數基于排隊響應合約明確傳遞給每個操作:
- [ServiceContract]
- interface ICalculatorResponse
- {
- [OperationContract(IsOneWay = true)]
- void OnAddCompleted(int result,ExceptionDetail error,
- string methodID);
- }