朋友炒股兩個月賺了10萬,我幫他推廣一下公眾號,把錢用來投資總比放銀行連通貨膨脹都跑不過里強, 硬核離職,在家炒股 ,這是他每天的日志,有些經驗是花錢也買不到的。
一、概述
WCF在通信過程中有三種模式:請求與答復、單向、雙工通信。以下我們一一介紹。
二、請求與答復模式
描述:
客戶端發送請求,然后一直等待服務端的響應(異步調用除外),期間處於假死狀態,直到服務端有了答復后才能繼續執行其他程序,如下圖所示(圖中的粗紅線在此時代表順序並不代表調用):
請求與答復模式為WCF的默認模式,如下代碼所示:
1 [OperationContract] 2 string ShowName(string name);
即使返回值是void 也屬於請求與答復模式。
缺點:如果用WCF在程序A中上傳一個2G的文件,那么要想執行程序B也許就是幾個小時后的事情了。如果操作需要很長的時間,那么客戶端程序的響應能力將會大大的下降。
優點:有返回值我們就可以向客戶端返回錯誤信息,如:只接收".rar"文件等信息。
實例:
1 //服務端接口
2 using System.ServiceModel; 3
4 namespace WCFService_Default 5 { 6 [ServiceContract] 7 public interface IUser 8 { 9 [OperationContract] 10 string ShowName(string name); 11 } 12 } 13 //服務端實現
14 namespace WCFService_Default 15 { 16 public class User : IUser 17 { 18 public string ShowName(string name) 19 { 20 //線程睡眠20秒鍾
21 System.Threading.Thread.Sleep(20000); 22 return "WCF服務,顯示名稱:" + name; 23 } 24 } 25 } 26
27 //客戶端調用
28 using System; 29 using WCFClient_Default.WCFService_Default; 30
31 namespace WCFClient_Default 32 { 33 class Program 34 { 35 static void Main(string[] args) 36 { 37 UserClient client = new UserClient(); 38 Console.WriteLine(DateTime.Now); 39 string result = client.ShowName("李林峰"); 40 Console.WriteLine(result); 41 Console.WriteLine(DateTime.Now); 42 Console.ReadLine(); 43 } 44 } 45 }
在上例中,我們在服務端讓線程睡眠20秒然后再返回客戶端,那么客戶端兩次顯示當前時間的間隔必然在20秒以上,如下圖所示:
二、單向模式
描述:
客戶端向服務端發送求,但是不管服務端是否執行完成就接着執行下面的程序。如下圖所示:
單向模式要在OpertaionContract的屬性中顯示設置值,代碼如下:
1 [OperationContract(IsOneWay = true)] 2 void ShowName(string name);
優缺點與“請求響應模式”差不多倒過來。
特點:使用 IsOneWay=true 標記的操作不得聲明輸出參數、引用參數或返回值
實例:
1 //服務端接口
2 using System.ServiceModel; 3
4 namespace WCFService_OneWay 5 { 6 [ServiceContract] 7 public interface IUser 8 { 9 [OperationContract(IsOneWay = true)] 10 void DoSomething(); 11 } 12 } 13
14 //服務端實現
15 namespace WCFService_OneWay 16 { 17 public class User : IUser 18 { 19 public void DoSomething() 20 { 21 //線程睡眠20秒鍾
22 System.Threading.Thread.Sleep(20000); 23 } 24 } 25 } 26
27 //客戶端調用
28 using System; 29 using WCFClient_OneWay.WCFService_OneWay; 30
31 namespace WCFClient_OneWay 32 { 33 class Program 34 { 35 static void Main(string[] args) 36 { 37 UserClient client = new UserClient(); 38 Console.WriteLine(DateTime.Now); 39 //調用WCF服務的方法
40 client.DoSomething(); 41 Console.WriteLine(DateTime.Now); 42 Console.ReadLine(); 43 } 44 } 45 }
在單向模式中與請求響應模式最主要的就是加IsOneWay屬性,運行效果如下:
三、雙工模式
描述:
雙工模式建立在上面兩種模式的基礎之上,實現客戶端與服務端相互的調用。相互調用:以往我們只是在客戶端調用服務端,然后服務端有返回值返回客戶端,而相互調用不光是客戶端調用服務端,而且服務端也可以調用客戶端的方法。如下圖所示:
在上圖中,客戶端的程序A調用服務端的程序A,服務程序A執行完成前又調用客戶端的程序D,然后再返回到程序A,圖有點亂,其實就是為了說明“服務端”與“客戶端”可以相互調用,下面直接看代碼。
如我們所說的,雙工模式是建立在以上兩種模式之上的模式,他們並不沖突,代碼如下:
1 [ServiceContract(CallbackContract = typeof(IUserCallback))] 2 public interface IUser 3 { 4 [OperationContract] 5 string ShowName(string name); 6 } 7 //回調的接口
8 public interface IUserCallback 9 { 10 [OperationContract(IsOneWay = true)] 11 void PrintSomething(string str);
12 }
實例:
支持回調的綁定有4種:WSDualHttpBinding、NetTcpBinding、NetNamedPipeBinding、NetPeerTcpBinding。我們這里用WSDualHttpBinding為例
1 //配置文件中的 binding 指定
2 <endpoint address="" binding="wsDualHttpBinding" contract="WCFService_DualPlex.IUser"></endpoint>
3
4 //服務端接口
5 using System.ServiceModel; 6
7 namespace WCFService_DualPlex 8 { 9 [ServiceContract(CallbackContract = typeof(IUserCallback))] 10 public interface IUser 11 { 12 [OperationContract] 13 string ShowName(string name); 14 } 15
16 public interface IUserCallback 17 { 18 [OperationContract(IsOneWay = true)] 19 void PrintSomething(string str); 20 } 21 } 22
23 //服務端實現
24 using System.ServiceModel; 25
26 namespace WCFService_DualPlex 27 { 28 public class User : IUser 29 { 30 IUserCallback callback = null; 31
32 public User() 33 { 34 callback = OperationContext.Current.GetCallbackChannel<IUserCallback>(); 35 } 36
37 public string ShowName(string name) 38 { 39 //在服務器端定義字符串,調用客戶端的方法向客戶端打印
40 string str = "服務器調用客戶端..."; 41 callback.PrintSomething(str); 42 //返回服務端方法
43 return "WCF服務,顯示名稱:" + name; 44 } 45 } 46 } 47
48 //客戶端調用
49 using System; 50 using System.ServiceModel; 51 using WCFClient_DualPlex.WCFService_DualPlex; 52
53 namespace WCFClient_DualPlex 54 { 55 //實現服務端的回調接口
56 public class CallbackHandler : IUserCallback 57 { 58 public void PrintSomething(string str) 59 { 60 Console.WriteLine(str); 61 } 62 } 63
64 class Program 65 { 66 static void Main(string[] args) 67 { 68 InstanceContext instanceContext = new InstanceContext(new CallbackHandler()); 69 UserClient client = new UserClient(instanceContext); 70 Console.WriteLine(DateTime.Now); 71 string result = client.ShowName("李林峰"); 72 Console.WriteLine(result); 73 Console.WriteLine(DateTime.Now); 74 Console.ReadLine(); 75 } 76 } 77 }
在上例中,我們把接口定義在服務端,而實現在客戶端,配置文件是由IDE自動生成的,我們在服務端ShowName方法中,調用了PringSomething的方法,實現了服務端向客戶端的調用。
執行效果如下圖所示:
四、代碼下載:
五、版權