淺談WCF的三種通信模式:請求響應模式、數據報模式和雙工通訊模式


 

一: WCF的服務端與客戶端在通信時有三種模式:請求響應模式、數據報模式和雙工通訊模式。

說一下基本知識,

      1、如果想要將當前接口作為wcf服務器,則一定要加上[ServiceContract] 契約

         2、要想將方法作為wcf服務方法發布給外部調用,則一定要加上    [OperationContract]契約

         3、實體類作為wcf方法參數或者返回值的話,則要貼上 [DataContract]

         4、只有貼上了[DataMember]的屬性才能作為wcf服務器方法參數值類傳遞,否則第三方調用者看不到此屬性

二:請求響應模式:當客戶端發出請求以后,一定要等待wcf服務的方法處理完成后才會響應給客戶端,此過程中,客戶端處於等待過程。如果服務端在處理大數據,很長的邏輯,執行耗時長,就不建議使用這種模式了。

實例:

 1 //服務端接口:
 2 
 3   [ServiceContract]
 4 
 5     public interface IWcfService
 6 
 7     {
 8 
 9         [OperationContract]
10 
11         string GetData(int value, int value2);
12 
13     }
14 
15 //服務端實現
16 
17   public class WcfService : IWcfService
18 
19     {
20 
21         public string GetData(int value,int value2)
22 
23         {
24 
25             Thread.Sleep(10000);
26 
27             return string.Format("你輸入的是: {0}", value + value2);
28 
29         }
30 
31     }
32 
33 下面我們用一個控制台程序托管WCF服務(也可以用windows服務托管等)
34 
35 class StartService
36 
37     {
38 
39         static void Main()
40 
41         {
42 
43             using (ServiceHost host = new ServiceHost(typeof(WcfServiceLibrary.WcfService)))
44 
45             {
46 
47                 host.Open();
48 
49                 Console.WriteLine("Wcf服務已啟動,輸入stop命令,停止服務!");
50 
51                 while (!Console.ReadLine().Equals("stop"))
52 
53                 {
54 
55                     Console.WriteLine("停止服務命令不正確!輸入stop命令,停止服務!");
56 
57                 }
58 
59                 host.Close();
60 
61                 Console.WriteLine("Wcf服務已停止!!!");
62 
63             }
64 
65             Console.ReadKey();
66 
67         }
68 
69 }
70 
71 //客戶端調用(這里就用WinForm來測試)
72 
73      WcfServiceClient client = new WcfServiceClient();
74 
75       MessageBox.Show(client.GetData(10, 15));
76 
77       client.Close();

 

上面我們讓服務端線程掛起10秒,這個時候客戶端只有等待10秒才能接收處理結果

 

三:數據報模式

要點:1.方法不能用返回值

     2.在方法契約上加上[OperationContract(IsOneWay=true)]

  數據報方法做的業務一般都是比較耗時的,一般分為如下類型:

     1、長時間的數據庫操作 ,比如海量表的拆分操作

     2、長時間的IO操作,比如長時間的文件保存

實例

 1 //服務器端接口:
 2 
 3 [ServiceContract]
 4 
 5     public interface IServiceForOneWay
 6 
 7     {
 8 
 9         [OperationContract(IsOneWay=true)]
10 
11         void GetData(int value);
12 
13     }
14 
15 //服務器端實現:
16 
17 public class ServiceForOneWay : IServiceForOneWay
18 
19     {
20 
21         public void GetData(int value)
22 
23         {
24 
25             Thread.Sleep(5000);
26 
27             string v = value.ToString();
28 
29         }
30 
31     }
32 
33 //客戶端調用(同上,我們用Winform測試)
34 
35   ServiceForOneWayClient OneWayClient = new ServiceForOneWayClient();
36 
37     OneWayClient.GetData(10);
38 
39     MessageBox.Show("調用完畢");

 

上例中:只要調用GetData方法,調用完畢會馬上顯示,因為是單向的數據報模式,從方法契約的命名參數IsOneWay=true我們就知道意思了。單向為true。但這樣客戶端就不知道服務器處理結果。

四:雙工通訊模式

雙工通訊wcf服務特點:

1、雙工方法的返回值為void

2、方法必須為數據報方法

3、服務契約必須強制開啟Session同時指定回調接口類型

4、配置文件中必須在終結點中指定綁定模式為雙工通信模式,

支持回調的綁定有4種:WSDualHttpBinding、NetTcpBinding、NetNamedPipeBinding、NetPeerTcpBinding。我們這里用wsDualHttpBinding為例

實例:

 

 1 //服務器端接口
 2 
 3     [ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IResult))]
 4 
 5     public interface IServiceForwsDual 6 7  { 8 9 [OperationContract(IsOneWay = true)] 10 11 void GetData(string value); 12 13  } 14 15 /// <summary> 16 17 /// 回調接口,會被客戶端的子類來實現 18 19 /// </summary> 20 21 public interface IResult 22 23  { 24 25 [OperationContract(IsOneWay = true)] 26 27 void DispalyResult(string result); 28 29 } 30 31 //服務器端實現: 32 33 /// <summary> 34 35 /// 在ServiceForwsDual構造函數中得到當前請求客戶端的回調實例對象 36 37 /// </summary> 38 39 public class ServiceForwsDual : IServiceForwsDual 40 41  { 42 43 IResult result=null; 44 45 public ServiceForwsDual() 46 47  { 48 49 //獲取當前客戶端請求上下文中的回調接口具體實現類的對象 50 51 result = System.ServiceModel.OperationContext.Current.GetCallbackChannel<IResult>(); 52 53  } 54 55 public void GetData(string value) 56 57  { 58 59 System.Threading.Thread.Sleep(5000); 60 61 62 63 result.DispalyResult("我是服務器,我處理完成了!"); 64 65  } 66 67  } 68 69 //客戶端調用: 70 71 //在代理客戶端的構造函數中,傳入第2步實現的回調接口的具體類對象 72 73   ServiceForwsDualClient wsDualClient = new ServiceForwsDualClient(new System.ServiceModel.InstanceContext(new DwsDualResult())); 74 75 wsDualClient.GetData("哈哈"); 76 77 MessageBox.Show("我是客戶端,我處理完成了");

 

上例中:客戶端調用后,會在5秒后再次‘alert‘出我是服務器,我處理完成了!

上面例子都是利用線程的掛起來模擬大數據,復雜耗時的邏輯處理。

五:源碼下載:WCFStudy

如有錯誤,歡迎留言批評指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM