WCF入門教程2——建立第一個WCF程式
引用網址:https://www.cnblogs.com/jiekzou/p/5325314.html
本節目標
- 掌握介面
- 理解契約式程式設計
- 建立宿主程式
- 建立客戶端程式訪問服務
什麼是介面
認識一下介面
必須知道的介面特性
- 介面不可以被例項化(常作為型別使用)
- 實現類必須實現介面的所有方法(抽象類除外)
- 實現類可以實現多個介面(Java,C#中的多繼承)
- 介面中的變數都是靜態常量
理解介面
定義一個介面是為了遵循同一種規範,便於程式的擴充套件。
介面是一種能力
介面是一種約定
關鍵字
Interface
public
abstract
理解契約式程式設計
契約合同能保障雙方的利益,對客戶來說,合同規定了供應者要做的工作;對供應者來說,合同說明了如果約定的條件不滿足,供應者沒有義務一定要完成規定的任務。該道理同樣也適用於軟體. 所以,契約式程式設計是程式設計的一種方法。
引入契約觀念之後,這種Client 與 Server 關係被打破,大家都是平等的,你需要我正確提供服務,那麼你必須滿足我提出的條件,否則我沒有義務“排除萬難”地保證完成任務。
WCF服務契約
服務契約描述了暴露給外部的型別(介面或類)、服務所支援的操作、使用的訊息交換模式和訊息的格式。每個WCF服務必須實現至少一個服務契約。使用服務契約必須要引用名稱空間System.ServiceModel 。
ServiceContractAttribute:該特性可被用來作用於子類或者介面之上,並允許重複宣告。
OperationContractAttribute:只有定義了該特性的方法才會被放入服務之中。
1、新建服務程式
新建專案——類庫,這裡我們先不直接新建一個WCF服務,而是新建一個類庫,命名為HelloService
新增引用
刪除Class1.cs,然後新建一個介面IHelloService.cs:
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.Linq;
- usingSystem.Text;
- usingSystem.ServiceModel;//新增名稱空間,這是WCF的核心庫
- namespaceHelloService
- {
- [ServiceContract]
- publicinterfaceIHelloService
- {
- [OperationContract]
- stringSayHello(stringname);
- }
- }
新增HelloService類:
- publicclass HelloService:IHelloService
- {
- publicstringSayHello(stringname)
- {
- return"你好,我是:"+name;
- }
- }
ServiceHost型別:當IIS活WAS作為宿主程式時,IIS和WAS會自動建立ServiceHost型別。
手動建立的基本語法:public ServiceHost(Type serviceType,params Uri[] baseAddresses);
2、新建宿主
新建專案——控制檯應用程式
然後新增System.ServiceModel引用,和專案引用HelloService,引用之前的類庫專案。
HelloServiceHost 專案中Program.cs程式碼如下:
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.Linq;
- usingSystem.Text;
- usingSystem.ServiceModel;
- usingSystem.ServiceModel.Channels;//使用到了繫結
- namespaceHelloServiceHost
- {
- classProgram
- {
- staticvoidMain(string[]args)
- {
- using(MyHelloHosthost=new MyHelloHost())
- {
- host.Open();
- Console.Console.ReadLine();
- }
- }
- }
- publicclassMyHelloHost:IDisposable
- {
- ///<summary>
- ///定義一個服務物件
- ///</summary>
- privateServiceHost_myHelloHost;
- publicconststringBaseAddress="net.pipe://localhost";//基地址
- publicconststringHelloServiceAddress="Hello";//可選地址
- publicstaticreadonlyTypeServiceType=typeof(HelloService.HelloService);//服務契約實現型別
- publicstaticreadonlyTypeContractType=typeof(HelloService.IHelloService);//服務契約介面
- publicstaticreadonlyBindingHelloBinding=newNetNamedPipeBinding();//服務定義一個繫結
- ///<summary>
- ///構造方法
- ///</summary>
- publicMyHelloHost()
- {
- CreateHelloServiceHost();
- }
- ///<summary>
- ///構造服務物件
- ///</summary>
- protectedvoidCreateHelloServiceHost()
- {
- _myHelloHost=new ServiceHost(ServiceType,newUri[]{newUri(BaseAddress)});//建立服務物件
- _myHelloHost.AddServiceEndpoint(ContractType,HelloBinding,HelloServiceAddress);//新增終結點
- }
- ///<summary>
- ///開啟服務方法
- ///</summary>
- publicvoidOpen()
- {
- Console.WriteLine("開始啟動服務...");
- _myHelloHost.Open();
- Console.WriteLine("服務已啟動");
- }
- ///<summary>
- ///銷燬服務宿主物件例項
- ///</summary>
- publicvoidDispose()
- {
- if(_myHelloHost!=null)
- (_myHelloHostasIDisposable).Dispose();
- }
- }
- }
3、新建客戶端呼叫程式
新建專案——控制檯應用程式
HelloClient專案中Program.cs程式碼如下:
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.Linq;
- usingSystem.Text;
- usingSystem.ServiceModel;
- usingSystem.ServiceModel.Channels;
- usingHelloService;
- namespaceHelloClient
- {
- classProgram
- {
- staticvoidMain(string[]args)
- {
- using(HelloProxyproxy=newHelloProxy())
- {
- //利用代理呼叫方法
- Console.WriteLine(proxy.Say("鄭少秋"));
- Console.ReadLine();
- }
- }
- }
- [ServiceContract]
- interfaceIService
- {
- [OperationContract]
- stringSay(stringname);
- }
- classHelloProxy:ClientBase<IHelloService>,IService
- {
- publicstaticreadonlyBindingHelloBinding=new NetNamedPipeBinding();//硬編碼定義繫結
- //硬編碼定義地址注意:這裡要和之前服務定義的地址保持一直
- publicstaticreadonlyEndpointAddressHelloAddress=new EndpointAddress(newUri("net.pipe://localhost/Hello"));
- publicHelloProxy():base(HelloBinding,HelloAddress){}//構造方法
- publicstringSay(stringname)
- {
- //使用Channel屬性對服務進行呼叫
- returnChannel.SayHello(name);
- }
- }
- }
先執行HelloServiceHost
然後執行HelloClient
部落格地址: | http://www.cnblogs.com/jiekzou/ | |
部落格版權: | 本文以學習、研究和分享為主,歡迎轉載,但必須在文章頁面明顯位置給出原文連線。 如果文中有不妥或者錯誤的地方還望高手的你指出,以免誤人子弟。如果覺得本文對你有所幫助不如【推薦】一下!如果你有更好的建議,不如留言一起討論,共同進步! 再次感謝您耐心的讀完本篇文章。 |
|
其它: | .net-QQ群4:612347965java-QQ群:805741535H5-QQ群:773766020 我的拙作《ASP.NET MVC企業級實戰》《H5+移動應用實戰開發》《Vue.js 2.x實踐指南》《JavaScript實用教程 》《Node+MongoDB+React 專案實戰開發》已經出版,希望大家多多支援! |