WCF學習——構建一個簡單的WCF應用(二)
引用網址:https://www.cnblogs.com/JamelAr/p/7062109.html
我們接著上一篇文章進行講解 http://www.cnblogs.com/songjianhui/p/7060698.html
一:客戶端通過新增引用呼叫服務
WCF應用服務被成功寄宿後,WCF服務應用便開始了服務呼叫請求的監聽工作。此外,服務寄宿將服務描述通過元資料的形式釋出出來,相應的客戶端就可以獲取這些元資料。接下來我們來建立客戶端程式進行服務的呼叫。
1)先執行服務寄宿程式(Hosting.exe)
2) 在Visual Studio 2013的“解決方案資源管理器”中,把Client專案展開,左鍵選中“引用”,點選滑鼠右鍵,彈出選單,在彈出的上下文選單中選擇“新增服務引用(Add Service References)”。如下圖。
3) 此時會彈出一個對話方塊,如下圖所示。在對話方塊中的“地址”輸入框中輸入服務元資料釋出的源地址:http://127.0.0.1:3721/calculatorService/metadata,並在“名稱空間”輸入框中輸入一個名稱空間,然後點選“確定”按鈕(如下圖)。Visual studio 2013會自動生成一系列用於服務呼叫的程式碼和配置。
4) 在Visual Studio 2013自動生成的類中,包含一個服務協定介面、一個服務代理物件和其他相關的類。
5) 我們可以例項化CalculatorServiceClient物件,執行相應方法呼叫WCF服務操作。客戶端進行WCF服務呼叫的程式碼如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Client 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 MyWcfService.CalculatorServiceClient client = new MyWcfService.CalculatorServiceClient(); 14 Console.WriteLine("x+y={2} when x={0} and y={1}", 1, 2, client.Add(1, 2)); 15 Console.WriteLine("x-y={2} when x={0} and y={1}", 1, 2, client.Add(1, 2)); 16 Console.WriteLine("x*y={2} when x={0} and y={1}", 1, 2, client.Add(1, 2)); 17 Console.WriteLine("x/y={2} when x={0} and y={1}", 1, 2, client.Add(1, 2)); 18 Console.ReadLine(); 19 } 20 } 21 }
6)結果
二:客戶端通過ChannelFactory<T>方式呼叫WCF服務
1) WCF採用基於契約的服務呼叫方法。從上面的例子也可以看到,Visual Studio2013 在進行服務引用新增的過程中會在客戶端建立一個與服務端等效的服務契 約介面。由於服務端和客戶端在同一個解決方案中。因此完全可以讓服務端和客戶端引用相同的契約
2) 為了演示這種場景,我們將新增的服務引用移除,併為Client專案新增Service.Interface專案的引用。在客戶端程式中基於地址和繫結物件建立一個 ChannelFactory<ICalculator>,然後呼叫它的CreateChannel方法 建立的服務代理物件完成服務呼叫(這裡我們就直接建立一個控制檯來進行演示)
3)建立一個控制檯應用程式 引用Service.Interface和System.ServiceModel;
4) 編寫ChanelClient的程式碼
1.通過程式碼的方式配置終結點
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using Service.Interface; 7 using System.ServiceModel; 8 9 namespace ChannelClient 10 { 11 class Program 12 { 13 static void Main(string[] args) 14 { 15 //基於地址和繫結物件建立一個ChannelFactory<ICalculator> 通過程式碼 16 using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>(new WSHttpBinding(), "http://127.0.0.1:3721/calculatorService")) 17 { 18 //建立服務代理物件 19 ICalculator proxy = channelFactory.CreateChannel(); 20 //呼叫計算器方法 21 Console.WriteLine("x+y={2} when x={0} and y={1}",1,2,proxy.Add(1,2)); 22 Console.WriteLine("x-y={2} when x={0} and y={1}", 1, 2, proxy.Add(1, 2)); 23 Console.WriteLine("x*y={2} when x={0} and y={1}", 1, 2, proxy.Add(1, 2)); 24 Console.WriteLine("x/y={2} when x={0} and y={1}", 1, 2, proxy.Add(1, 2)); 25 26 Console.ReadLine(); 27 } 28 } 29 } 30 }
2.通過配置檔案的方式來配置終結點(在app.config中進行配置)
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <system.serviceModel> <client> <endpoint name="calculatorService" address="http://127.0.0.1:3721/CalculatorService" binding="wsHttpBinding" contract="Service.Interface.ICalculator"/> </client> </system.serviceModel> </configuration>
ChannelClient中的程式碼就要進行更改
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using Service.Interface; 7 using System.ServiceModel; 8 9 namespace ChannelClient 10 { 11 class Program 12 { 13 static void Main(string[] args) 14 { 15 //基於地址和繫結物件建立一個ChannelFactory<ICalculator> 通過程式碼 16 //using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>(new WSHttpBinding(), "http://127.0.0.1:3721/CalculatorService")) 17 //{ 18 // //建立服務代理物件 19 // ICalculator proxy = channelFactory.CreateChannel(); 20 // //呼叫計算器方法 21 // Console.WriteLine("x+y={2} when x={0} and y={1}",1,2,proxy.Add(1,2)); 22 // Console.WriteLine("x-y={2} when x={0} and y={1}", 1, 2, proxy.Add(1, 2)); 23 // Console.WriteLine("x*y={2} when x={0} and y={1}", 1, 2, proxy.Add(1, 2)); 24 // Console.WriteLine("x/y={2} when x={0} and y={1}", 1, 2, proxy.Add(1, 2)); 25 26 // Console.ReadLine(); 27 //} 28 29 //基於地址和繫結物件建立一個ChannelFactory<ICalculator> 通過配置檔案 30 using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>("calculatorService")) 31 { 32 //建立服務代理物件 33 ICalculator proxy = channelFactory.CreateChannel(); 34 //呼叫計算器方法 35 Console.WriteLine("x+y={2} when x={0} and y={1}", 1, 2, proxy.Add(1, 2)); 36 Console.WriteLine("x-y={2} when x={0} and y={1}", 1, 2, proxy.Add(1, 2)); 37 Console.WriteLine("x*y={2} when x={0} and y={1}", 1, 2, proxy.Add(1, 2)); 38 Console.WriteLine("x/y={2} when x={0} and y={1}", 1, 2, proxy.Add(1, 2)); 39 40 Console.ReadLine(); 41 } 42 } 43 } 44 }
5) 執行hosting.exe應用程式
6)執行ChanelClient
原始碼地址:
https://github.com/JamelsAr/WcfServicesFirst
https://github.com/JamelsAr/WcfServicesSecond
https://github.com/JamelsAr/WcfServicesThird