天天看點

WCF揭秘——可靠性會話功能相關文章

一、可靠性會話

Windows Communication Foundation (WCF) 可靠性會話是一個如 WS-ReliableMessaging 協定所定義的 SOAP 可靠消息傳遞的實作。它在綁定層保證消息隻會被傳送一次,并能确定消息之間的傳輸順序。它的特性在于保證了傳輸過程中消息不會丢失或者錯位,在連接配接掉線的 時候,它會重新連接配接伺服器,連接配接次數可在配置檔案中設定,當在連接配接失敗的時候,能自動釋放對話所占用的資源。

系統有多個綁定支援可靠性會話功能:wsHttpBinding、wsDualHttpBinding、wsFederationBinding、 netTcpBinding、netNamedPipesBinding。其中wsHttpBinding、wsFederationBinding、 netTcpBinding在預設情況下可靠性會話功能是關閉。而wsDualHttpBinding、netNamedPipesBinding則預設 支援可靠性功能。

二、開發執行個體

可靠性會話功能可以通過代碼綁定,也可以通過config配置統一綁定,值得注意的是伺服器端要與用戶端的配置必須保持一緻,避免出現沖突。下面以 netTcpBinding契約為例子,說明一下可靠性會話的功能。首先建立資料契約Person,和服務契約PersonService,用戶端通過 GetPerson方法擷取Person對象。

伺服器端

 1 namespace Pro.Model 

 2 { 

 3     //建立資料契約 

 4     [DataContract] 

 5     public class Person 

 6     { 

 7         [DataMember] 

 8         public int ID 

 9         { 

10             get; 

11             set; 

12         } 

13  

14         [DataMember] 

15         public string Name 

16         { 

17             get; 

18             set; 

19         } 

20  

21         [DataMember] 

22         public int Age 

23         { 

24             get; 

25             set; 

26         } 

27     } 

28 } 

29  

30 namespace Pro.Service 

31 { 

32     // 建立服務契約接口“IPersonService”。 

33     [ServiceContract] 

34     public interface IPersonService 

35     { 

36         [OperationContract] 

37         Person GetPerson(); 

38     } 

39  

40     // 實作服務契約“PersonService”。 

41     [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 

42     public class PersonService : IPersonService 

43     { 

44         public Person GetPerson() 

45         { 

46             Person person = new Person(); 

47             person.ID = 0; 

48             person.Name = "Leslie"; 

49             person.Age = 31; 

50              

51             return person; 

52         } 

53     } 

54  

55     class Program 

56     { 

57         //啟動服務 

58         static void Main(string[] args) 

59         { 

60             Console.WriteLine("Service star!"); 

61             ServiceHost host1 = new ServiceHost(typeof(PersonService)); 

62             host1.Open(); 

63             Console.ReadKey(); 

64             host1.Close(); 

65         } 

66     } 

67 } 

添加config配置檔案,加入 reliableSession 配置,包含以下屬性

1.enable 

傳回值為bool類型,代表是否打開可靠性功能。

2.inactivityTimeout 

傳回值為TimeSpan類型,代表閑置逾時時間,預設值為10分鐘,如果用戶端已經建立起服務對象,在超過此時間内沒有重新調用這些對象,系統将 發送提示資訊: “通信對象 System.ServiceModel.Channels.ServiceChannel 無法用于通信,因為其處于‘出錯’狀态。”。

3.ordered

傳回值為bool類型,代表是否開啟“有序性”性功能,如果開啟此功能,代表消息将按順序傳送。

4.maxPendingChannels

傳回值為int 類型,代表最大等候信道,預設值為4。

5.maxRetryCount

傳回值為int 類型,表示最大重複發送次數,預設值為8,最大值為20。如果因斷線等原因連接配接失敗,用戶端重試次數超過此最大值,系統将發出錯誤提示。

6.flowControlEnabled

傳回值為bool類型,預設值為true,代表是否啟動流量控制器。啟動後,當接收方的傳輸資料緩沖區已滿時,發送方将延遲發送資訊。

7.acknowledgementInterval

傳回值為TimeSpan類型,預設值為00:00:00.2(即0.2秒),代表接收方在接收資訊之前所需要的等待時間。

8.maxTransferWindowSize

傳回值為int類型,預設值為8,用于控制資料緩沖區數量。

在以上例子中,隻在netTcpBincding綁定中加入了enable與inactivityTimeout兩個最常用的功能,其意義隻在于打 開可靠性會話功能,把逾時時間設定為10秒(定制10秒的逾時時間,其用意是在于測試在10秒後再次調用服務對象,對象是否會抛出錯誤提示)。

用戶端

建立一個網站項目,添加對PersonService服務的引用,在頁面加入一個Label控件與一個Button控件,在Button的onClick方法調用PersonService服務。

配置用戶端檔案,打開可靠性會話功能,注意把逾時時間設定為10秒,與伺服器的配置同步。在常用的服務處理頁面,使用單體模式或者靜态對象,在一定 程式上可以減少伺服器的負荷,提高效率。值得注意的是,如果使用單體模式,當服務啟動10秒後,如果并未被再次調用,那下次調用時,系統将顯示錯誤資訊: “通信對象 System.ServiceModel.Channels.ServiceChannel 無法用于通信,因為其處于‘出錯’狀态”。是以,在配置“逾時時間”時,應該注意控制時間的長短。

為了避免出現以上錯誤,在下建議在調用不經常使用的服務之時,應該把服務對象及時銷毀,下次調用時重建立立一個服務對象。(可參考“注意事項”)

三、注意事項

值得注意的一點是,在某些不常用到的頁面中(比如在Login登入頁面),客戶往往在長時間内隻調用一次服務,是以應該注意對服務對象進行及時銷毀,否則客戶再次登入時就會出來錯誤。

<a href="http://www.cnblogs.com/leslies2/archive/2011/01/26/1934163.html">簡單的WCF開發執行個體</a>

<a href="http://www.cnblogs.com/leslies2/archive/2011/01/26/1934889.html">使用AJAX+WCF進行頁面開發</a>

<a href="http://www.cnblogs.com/leslies2/archive/2011/08/03/2115091.html">共享資料契約</a>

<a href="http://www.cnblogs.com/leslies2/archive/2011/08/08/2129422.html">可靠性會話功能</a>

本文轉自 leslies2  51CTO部落格,原文連結:http://blog.51cto.com/79100812/634310

繼續閱讀