嘻嘻哈,其實學習wcf純屬意外,因為當時是想看一下wpf,結果很不小心搜成了wcf(不知道當時心里怎么想的手給打錯了),因為已經了去了解了wcf並且google了一些資料,心想既來之則安之,便整理了一些基本的筆記,寫出來順便就當理整理一下我的思路了。也可以給wcf想入門的同志們一點點參考。
wcf是做什么的,網上講解很多,我就不多說了,我只想把我的第一個wcf代碼程序展示出來,並且會附上詳細注釋。因為我的工作一直是做winform程序的,所以,該程序的服務器端和客戶端均使用控制台應用程序進行開發。
wcf是具體的開發流程,msdn上解釋是分為六部:
1,定義 Windows Communication Foundation 服務協定,說白了也就是我們通常所說的接口(intferface),只是比平時的接口多了幾個屬性。如下:
/// <summary> /// 這些屬性的命名空間為using System.ServiceModel /// 該程序集一般情況下在C:\WINDOWS\Microsoft.NET\Framework\v3.0\Windows Communication Foundation文件中 /// </summary> [ServiceContract] //服務協定 public interface IHelloWordWCF { [OperationContract] //數據協定,改屬性表明,改服務會公開此方法,也就說客戶端可以調用到 void Writer(string name); [OperationContract] string DoSome(); void S(); //無協定,客戶端將無法調用 }
怎么樣,定義一個協議簡單吧,那就進行第二步
2,實現 Windows Communication Foundation 服務協定,其實也就是定義一個繼承自剛才我們定義的協定(IHellowWordWCF)的類
/// <summary> /// 實現改協定 /// </summary> public class HelloWordWCF:IHelloWordWCF { #region IHelloWordWCF 成員 public void Writer(string name) { Console.WriteLine(name); Console.ReadLine(); } public string DoSome() { return "yangyang"; } public void S() { } #endregion }
這不,就實現了協定,在接口方法中可以寫需要實現的功能,下一步就沒這么常見了。
3,承載和運行基本的 Windows Communication Foundation 服務,也就是說,你剛才實現了協定的服務,那么,還得去承載運行發布呢。以方便客戶端的調用。
//定義一個基址。以方便客戶端尋址。該URI指定HTTP方案、地計算機、端口號 8080 static Uri uri = new Uri("http://localhost:8080/yangyang"); static void Main(string[] args) { //創建Service實例承載服務 //HelloWordWCF:承載服務的基本協定。 //uri:包含承載服務的基址 using (ServiceHost host = new ServiceHost(typeof(HelloWordWCF), uri)) { try { //加載該服務的終結點, host.AddServiceEndpoint(typeof(IHelloWordWCF), new WSHttpBinding(), "HelloWordWCF"); //控制服務元數據和相關信息的發布。 發布服務了 ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; //元數據以使用 HTTP/GET 請求進行檢索。 host.Description.Behaviors.Add(smb); host.Open(); Console.Write("The Service address is {0}", uri); Console.ReadLine(); host.Close(); } catch (CommunicationException ex) //表示服務或客戶端應用程序中的通信錯誤。 { throw; } } }
好了,至此,我們的超級超級簡單的服務器端的編碼算是完成了,編譯成功后,調試-啟動新實例。在瀏覽器中輸入剛才定義的基址http://localhost:8080/yangyang,效果如下,
然后呢,我們打開vs的命令提示,輸入“WcfTestClient”,然后回車,彈出如下窗體,輸入我們的服務基址,就可以測試我們的服務是否可以正常工作了。如下圖
如果測試通過,恭喜了,我們的服務器端已經建立起來了,現在,我們就需要實現我們的客戶端了。也就是我們的第四步;
4,創建 Windows Communication Foundation 客戶端
建了項目,我們首先引用using System.ServiceModel
我們需要命令行工具 ServiceModel 元數據實用工具 (Svcutil.exe)幫我們生成服務器代碼文件和配置文件,如下圖所示
如圖,首先執行紅下滑線的命令,后面是我們服務的基址,然后回車,就會在藍色下划線的目錄生成這兩個文件,我們需要在客戶端添加現有文件,將這兩個文件進行添加,generatedProxy.cs是服務文件的代碼,使我們可以訪問服務器的接口方法,app.config中,是生成服務器端的一些配置。接下來的第五步
5,配置基本 Windows Communication Foundation 客戶端,第五步吧,其實是做一些總結點的配置,因為我這個演示是比較簡單的,沒有做繁雜的操作,所以,我就原本原樣的使用svcutil.exe生成的配置,藍色圈出的地方是服務代碼中的終結點的名稱,我們需要記錄一下。
呵呵,這時候如果一切順利,馬上就要成功了,最后一步了
6,使用 Windows Communication Foundation 客戶端
代碼如下
static void Main(string[] args) { //使用剛才記錄終結點的名稱,初始化一個服務協定的實體 HelloWordWCFClient client = new HelloWordWCFClient("WSHttpBinding_IHelloWordWCF"); Console.WriteLine(client.DoSome()); //呵呵,我承認我的設計有點扯淡,協定中DoSome()中返回了“yangyang”這個字符串。 Console.ReadLine(); }
ok,一個簡單的wcf程序就好了,現在,在文件夾中找出我們的服務端的程序,在bin-debug中編譯好的Service.exe。然后,調試我們的客戶端,結果如下圖
這個時候我們的客戶端已經成功調用了服務器端的方法。
我列出我的項目結構圖:
所有的代碼都在服務協定,接口都在programs里面寫着。客戶端藍色圈出部分是svcutil.exe生成的。兩個項目都需要添加syste.ServiceModel程序集。
哪里寫的不對,還請讀者體諒一下,wcf的新手拉。嘻嘻