WCF方面的HelloWorld例子網(wǎng)上已經(jīng)很多了,。再寫這個顯得有些“Out”了,,不過只是作為筆記寫一下,。本篇使用的場景是從網(wǎng)上看到的:WCF服務(wù)端創(chuàng)建一個服務(wù)并公開地址,。WCF客戶端訪問該地址并發(fā)送字符串?dāng)?shù)據(jù),。服務(wù)端收到數(shù)據(jù)之后組合一個新的字符串?dāng)?shù)據(jù)并返回給客戶端顯示,。 下圖是運行時的效果,源碼在此下載,。
項目結(jié)構(gòu)及開發(fā)步驟 本示例中所有的項目都是采用類庫的方式創(chuàng)建的,,在開發(fā)過程中需要手工去添加System.ServiceModel組件和命名空間。Visual Studio 2005/2008有專門創(chuàng)建WCF的模板,,如果為了省事的話也可以直接使用該模板,。以下是簡單的在開發(fā)步驟及說明。
第一步 創(chuàng)建服務(wù)協(xié)定(Interface) Cbcye.Contract 用于創(chuàng)建服務(wù)的協(xié)定(契約),,該協(xié)定中描述了服務(wù)提供的方法集,,本示例只創(chuàng)建了一個GetString的方法。該協(xié)定需要在服務(wù)端和客戶端都實現(xiàn),。 最開始學(xué)的時候?qū)@個服務(wù)端和客戶端都需要實現(xiàn)服務(wù)協(xié)定不是很理解,,以為如果通過DLL引用的方式來實現(xiàn)服務(wù)協(xié)定共享的話那么是不是會限制WCF的應(yīng)用范圍,,現(xiàn)在了解到其實服務(wù)的協(xié)定是可以通過WSDL來描述的,,那就是說像Web Service一樣,,其他非WCF的應(yīng)用程序也可以使用。 //[1]創(chuàng)建服務(wù)協(xié)定
namespace Cbcye.Contract { [ServiceContract] public interface IHelloWorld { [OperationContract] string Getstring(string InStr); } }
第二步 根據(jù)服務(wù)協(xié)定實現(xiàn)服務(wù)(具體是做什么的) Cbcye.Service 用于創(chuàng)建服務(wù),,就是根據(jù)服務(wù)協(xié)定實現(xiàn)服務(wù)的具體方法,,比如本示例中的使用 //[2] 實現(xiàn)協(xié)定
namespace Cbcye.Service { public class HelloWorldService:IHelloWorld { #region IHelloWorld Members public string Getstring(string InStr) { return "You Input String is:" + InStr; } #endregion } }
第三步 創(chuàng)建承載服務(wù)的應(yīng)用程序(服務(wù)在哪運行) Cbcye.ServiceConsoleHost 用于承載服務(wù),就是該服務(wù)是由哪個應(yīng)用程序來運行的,。本示例中采用Windows控制臺應(yīng)用程序來承載服務(wù) //[3] 將服務(wù)托管在控制臺應(yīng)用程序 namespace Cbcye.ServiceConsoleHost { class Program { static void Main(string[] args) { StartListener(); } public static void StartListener() { //WCF配置信息在App.Config中 using (ServiceHost host = new ServiceHost(typeof(HelloWorldService))) { //注冊啟動時事件 host.Opened += delegate { Console.WriteLine("[Server] Begins to listen request on " + host.BaseAddresses[0].ToString()); }; host.Open(); Console.Read(); } } } }
服務(wù)的配置信息存放到App.Config里 <?xml version="1.0" encoding="utf-8" ?>
<configuration> <!-- WCF 配置聲明--> <system.serviceModel> <services> <!-- 服務(wù)名稱跟Cbcye.Service項目中的一致,使用命名空間.類名 --> <service name="Cbcye.Service.HelloWorldService"> <!-- address - 指定這個Endpoint對外的URI,這個URI可以是個絕對地址,,也可以是個相對于baseAddress的 相對地址。如果此屬性為空,,則這個Endpoint的地址就是baseAddress binding - 指定這個Endpoint使用的binding,,這個banding可以是系統(tǒng)預(yù)定義的9個binding之一, 比如是basicHttpBinding,,也可以是自定義的customBinding。binding決定了通訊的類型,、 安全,、如何編碼、是否基于session,、是否基于事務(wù)等等,。 contract- 指定這個Endpoint對應(yīng)的Contract的全限定名(名稱空間.類型名),這個Contract應(yīng)該是被 service元素的name指定的那個service實現(xiàn),。 name - Endpoint的名稱,,可選屬性,每個Contract都可以有多個Endpoint,,但是每個Contract對應(yīng)的 多個Endpoint名必須是唯一的 --> <endpoint address="" binding="basicHttpBinding" contract="Cbcye.Contract.IHelloWorld" name=""></endpoint> <host> <baseAddresses> <!-- 在此可以定義每種傳輸協(xié)議的baseAddress,,用于跟使用同樣傳輸協(xié)議Endpoint定義的相對地 址組成完整的地址,但是每種傳輸協(xié)議只能定義一個baseAddress,。HTTP的baseAddress同時是service 對外發(fā)布元數(shù)據(jù)的URL--> <add baseAddress="http://localhost:7788/cbcye/helloworld%22/> </baseAddresses> </host> </service> </services> </system.serviceModel> </configuration>
第四步 創(chuàng)建客戶端調(diào)用服務(wù) Cbcye.Client 用于消費WCF服務(wù)端提供出來的服務(wù),,由于客戶端也需要實現(xiàn)服務(wù)協(xié)定(第一步創(chuàng)建的)因此需要在服務(wù)端創(chuàng)建代理類用于實現(xiàn)協(xié)定。 客戶端代理類代碼 //[4] 實現(xiàn)客戶端代理類
namespace Cbcye.Client { //ClientBase提供基實現(xiàn),,用于創(chuàng)建可調(diào)用服務(wù)的WCF客戶端對象 //擴(kuò)展 ClientBase<(Of <(TChannel>)>) 類可以創(chuàng)建可用于連接服務(wù)的自定義 WCF 客戶端對象 class ClientProxy:ClientBase<IHelloWorld>,IHelloWorld { public ClientProxy() : base() { } #region IHelloWorld Members public string Getstring(string InStr) { //信道工廠,創(chuàng)建用于消息發(fā)送的信道,。 return this.Channel.Getstring(InStr); } #endregion } }
客戶端調(diào)用程序代碼 //[5]調(diào)用服務(wù)端服務(wù)的方法
namespace Cbcye.Client { class Program { static void Main(string[] args) { using (ClientProxy proxy = new ClientProxy()) { //請求Hello World字符串給服務(wù)器端 Console.WriteLine("[Client] " + proxy.Getstring("Hello World")); } Console.Read(); } } }
客戶端應(yīng)用程序配置 <?xml version="1.0" encoding="utf-8" ?>
<configuration> <system.serviceModel> <client> <!--參照Host項目的配置文件注釋--> <endpoint address="http://localhost:7788/cbcye/helloworld%22 binding="basicHttpBinding" contract="Cbcye.Contract.IHelloWorld"></endpoint> </client> </system.serviceModel> </configuration>
總結(jié) Ok,第一個WCF應(yīng)用程序已經(jīng)實現(xiàn)完了,本程序為了簡便開發(fā)過程,,將WCF的配置信息都放到了App.Config來配置,。也體現(xiàn)了WCF框架的高效和靈活性。WCF基本概念請參見《WCF服務(wù)編程-基礎(chǔ)》 |
|
來自: goodwangLib > 《WCF》