一: 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
如有錯誤,歡迎留言批評指正。