一、可靠性會話
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