1. 程式人生 > 其它 >WCF入門教程2——建立第一個WCF程式

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:

  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.Linq;
  4. usingSystem.Text;
  5. usingSystem.ServiceModel;//新增名稱空間,這是WCF的核心庫
  6. namespaceHelloService
  7. {
  8. [ServiceContract]
  9. publicinterfaceIHelloService
  10. {
  11. [OperationContract]
  12. stringSayHello(stringname);
  13. }
  14. }

新增HelloService類:

  1. publicclass HelloService:IHelloService
  2. {
  3. publicstringSayHello(stringname)
  4. {
  5. return"你好,我是:"+name;
  6. }
  7. }

ServiceHost型別:當IIS活WAS作為宿主程式時,IIS和WAS會自動建立ServiceHost型別。

手動建立的基本語法:public ServiceHost(Type serviceType,params Uri[] baseAddresses);

2、新建宿主

新建專案——控制檯應用程式

然後新增System.ServiceModel引用,和專案引用HelloService,引用之前的類庫專案。

HelloServiceHost 專案中Program.cs程式碼如下:

  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.Linq;
  4. usingSystem.Text;
  5. usingSystem.ServiceModel;
  6. usingSystem.ServiceModel.Channels;//使用到了繫結
  7. namespaceHelloServiceHost
  8. {
  9. classProgram
  10. {
  11. staticvoidMain(string[]args)
  12. {
  13. using(MyHelloHosthost=new MyHelloHost())
  14. {
  15. host.Open();
  16. Console.Console.ReadLine();
  17. }
  18. }
  19. }
  20. publicclassMyHelloHost:IDisposable
  21. {
  22. ///<summary>
  23. ///定義一個服務物件
  24. ///</summary>
  25. privateServiceHost_myHelloHost;
  26. publicconststringBaseAddress="net.pipe://localhost";//基地址
  27. publicconststringHelloServiceAddress="Hello";//可選地址
  28. publicstaticreadonlyTypeServiceType=typeof(HelloService.HelloService);//服務契約實現型別
  29. publicstaticreadonlyTypeContractType=typeof(HelloService.IHelloService);//服務契約介面
  30. publicstaticreadonlyBindingHelloBinding=newNetNamedPipeBinding();//服務定義一個繫結
  31. ///<summary>
  32. ///構造方法
  33. ///</summary>
  34. publicMyHelloHost()
  35. {
  36. CreateHelloServiceHost();
  37. }
  38. ///<summary>
  39. ///構造服務物件
  40. ///</summary>
  41. protectedvoidCreateHelloServiceHost()
  42. {
  43. _myHelloHost=new ServiceHost(ServiceType,newUri[]{newUri(BaseAddress)});//建立服務物件
  44. _myHelloHost.AddServiceEndpoint(ContractType,HelloBinding,HelloServiceAddress);//新增終結點
  45. }
  46. ///<summary>
  47. ///開啟服務方法
  48. ///</summary>
  49. publicvoidOpen()
  50. {
  51. Console.WriteLine("開始啟動服務...");
  52. _myHelloHost.Open();
  53. Console.WriteLine("服務已啟動");
  54. }
  55. ///<summary>
  56. ///銷燬服務宿主物件例項
  57. ///</summary>
  58. publicvoidDispose()
  59. {
  60. if(_myHelloHost!=null)
  61. (_myHelloHostasIDisposable).Dispose();
  62. }
  63. }
  64. }

3、新建客戶端呼叫程式

新建專案——控制檯應用程式

HelloClient專案中Program.cs程式碼如下:

  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.Linq;
  4. usingSystem.Text;
  5. usingSystem.ServiceModel;
  6. usingSystem.ServiceModel.Channels;
  7. usingHelloService;
  8. namespaceHelloClient
  9. {
  10. classProgram
  11. {
  12. staticvoidMain(string[]args)
  13. {
  14. using(HelloProxyproxy=newHelloProxy())
  15. {
  16. //利用代理呼叫方法
  17. Console.WriteLine(proxy.Say("鄭少秋"));
  18. Console.ReadLine();
  19. }
  20. }
  21. }
  22. [ServiceContract]
  23. interfaceIService
  24. {
  25. [OperationContract]
  26. stringSay(stringname);
  27. }
  28. classHelloProxy:ClientBase<IHelloService>,IService
  29. {
  30. publicstaticreadonlyBindingHelloBinding=new NetNamedPipeBinding();//硬編碼定義繫結
  31. //硬編碼定義地址注意:這裡要和之前服務定義的地址保持一直
  32. publicstaticreadonlyEndpointAddressHelloAddress=new EndpointAddress(newUri("net.pipe://localhost/Hello"));
  33. publicHelloProxy():base(HelloBinding,HelloAddress){}//構造方法
  34. publicstringSay(stringname)
  35. {
  36. //使用Channel屬性對服務進行呼叫
  37. returnChannel.SayHello(name);
  38. }
  39. }
  40. }

先執行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 專案實戰開發》已經出版,希望大家多多支援!