C# 編寫WCF簡單的服務端與客戶端


http://www.wxzzz.com/1860.html

 

Windows Communication Foundation(WCF)是由微軟開發的一系列支持數據通信的應用程序框架,可以翻譯為Windows 通訊開發平台。整合了原有的windows通訊的 .net Remoting,WebService,Socket的機制,並融合有HTTP和FTP的相關技術。是Windows平台上開發分布式應用最佳的實踐方式。

今天帶如何一步一步實現WCF服務端與客戶端的開發及基礎講解。

 

一、在Visual Studio中創建WCF項目

首先打開Visual Studio(我這里使用的是VS2013),然后創建一個空的解決方案命名為WCFDemo

然后創建下面列出的4個項目並進行關系引用。

  • Contracts:它是一個類庫項目,用於定義契約,在項目的引用中添加System.ServiceMode程序集;
  • Services:它是一個類庫項目,用於實現契約,所以需要引用我們的Contracts項目;
  • Hosting:一個控制台應用,實現啟動WCF服務,該項目須要同時引用我們的Contracts項目和Services項目,並且引用System.ServiceMode程序集;
  • Client:一個控制台應用,也需要引用System.ServiceMode程序集;

創建好后,如圖所示:

VS_WCF

 

二、創建服務契約

首先我們需要在Contracts項目中創建契約(也就是interface接口),這里我的契約指定需要實現2個功能,分別是GetServerTime獲取服務器當前時間,GetServerName獲取服務器名稱。

編寫代碼的時候需要注意,需要給interface加上ServiceContract標記屬性(指示接口或類在WCF應用程序中定義服務協定),每個契約的方法需要加上OperationContract標記屬性(指示方法定義一個操作,該操作是WCF應用程序中服務協定的一部分)。最終,如下代碼所示:

[ServiceContract] public interface IGetServerInfo { [OperationContract] string GetServerTime(); [OperationContract] string GetServerName(); }

 

三、實現服務契約

剛剛我們已經在Contracts項目中創建好了一個IGetServerInfo的契約,現在我們需要到Services項目中創建一個GetServerInfoService類實現,該類繼承IGetServerInfo進行實現即可,我編寫了如下代碼進行演示,分別實現了獲取服務器當前時間、獲取服務器的名稱(我這里為了演示直接返回"Server Name:wxzzz"字符串給客戶端)。

public class GetServerInfoService:IGetServerInfo { public string GetServerTime() { return DateTime.Now.ToString(); } public string GetServerName() { return "Server Name:wxzzz"; } }

 

四、啟動WCF服務

WCF服務可以自己創建程序監聽服務,也可以寄宿於IIS提供服務。咱們這里先使用自己的程序進行WCF服務監聽。

WCF是一個基於消息的通信框架,采用基於終結點(Endpoint)的通信手段。終結點由地址(Address)、綁定(Binding)和契約(Contract)三要素組成。

  • 地址(Address):地址決定了服務的位置;
  • 綁定(Binding):綁定實現了通信的所有細節,包括網絡傳輸、消息編碼,以及其他為實現某種功能(比如安全、可靠傳輸、事務等)對消息進行的相應處理。WCF中具有一系列的系統定義綁定,比如BasicHttpBinding、WsHttpBinding、NetTcpBinding等;
  • 契約(Contract):契約是對服務操作的抽象,也是對消息交換模式以及消息結構的定義。

基於這些技術基礎知識,下面是我在項目Hosting中編寫的WCF服務代碼塊。

 static void Main(string[] args) { using (ServiceHost host = new ServiceHost(typeof(GetServerInfoService))) { host.AddServiceEndpoint(typeof(IGetServerInfo), new WSHttpBinding(), "http://127.0.0.1:9999/getserverinfoservice"); if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null) { ServiceMetadataBehavior behavior = new ServiceMetadataBehavior(); behavior.HttpGetEnabled = true; behavior.HttpGetUrl = new Uri("http://127.0.0.1:9999/getserverinfoservice/metadata"); host.Description.Behaviors.Add(behavior); } host.Opened += delegate { Console.WriteLine("GetServerInfoService已經啟動,按任意鍵終止服務!"); }; host.Open(); Console.Read(); } }

在上面提供的服務寄宿代碼中,我們為創建的ServiceHost添加了ServiceMetadataBehavior,並采用了基於HTTP-GET的元數據獲取方式,元數據的發布地址通過ServiceMetadataBehaviorHttpGetUrl指定。在調用ServiceHostOpen方法對服務成功寄宿后,我們可以通過該地址獲取服務相關的元數據。在瀏覽器的地址欄上鍵入http://127.0.0.1:9999/getserverinfoservice/metadata,你將會得到以WSDL形式體現的服務元數據,如下圖所示。

WCF_Metadata

權限問題:

如果無法啟動該WCF服務,並提示錯誤:其他信息: HTTP 無法注冊 URL http://+:9999/getserverinfoservice/。進程不具有此命名空間的訪問權限(有關詳細信息,請參見 http://go.microsoft.com/fwlink/?LinkId=70353)

遇到這種問題時,將Visual Studio關閉,然后用管理員方式啟動Visual Studio打開項目即可。

 

五、客戶端調用WCF服務

我們編寫的WCF服務成功運行后,這時我們就可以使用客戶端來訪問服務端了(前提是服務端一定是在運行狀態)。那么在客戶端如何調用我們編寫的WCF服務呢,其實很簡單,我們一步一步來操作。

1.在Client項目中引用單擊鼠標右鍵,選擇添加服務引用,如圖所示:

WCF_Client

然后彈出界面,我們在地址欄填寫http://127.0.0.1:9999/getserverinfoservice/metadata然后單擊“轉到”按鈕,即可看見我們的服務,如圖所示:

WCF_Client_WebService

然后單擊確定即可,此時服務就已經引用成功了。此時我們需要編寫客戶端代碼運行試試看,能否得到我們的期望的結果,Client項目中控制台代碼如下所示:

 static void Main(string[] args) { ServiceReference1.GetServerInfoClient client = new ServiceReference1.GetServerInfoClient(); string sTime = client.GetServerTime(); Console.WriteLine("服務器時間:" + sTime); string sName = client.GetServerName(); Console.WriteLine("服務器名稱:" + sName); Console.Read(); }

編寫完成后,運行(WCF服務端一定要開啟)試試看,運行效果如下所示:

WCF_Client_Run

嗯,這樣我們基本上就完成了WCF服務端與客戶端的簡單示例。

實際上在WCF中還有非常非常多的功能、擴展、細節配置等,將在后面的文章中繼續陳述。

本文示例源碼下載:WCFDemo


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM