1. 程式人生 > >VS 2010中使用C#建立及呼叫WCF完整例項(Windows服務宿主)

VS 2010中使用C#建立及呼叫WCF完整例項(Windows服務宿主)

關於WCF的概念、原理、優缺點等,在這裡就不多說了,網上很多,可以自行搜尋,比我解釋的要專業的多。

這裡直接說使用Windows 服務(Windows Service)作為宿主如何實現,其它方式不在此次教程之內

文章最後有本例的下載連線,包含原始碼、說明教程、編譯後文件

例項環境:Windows Server 2008 R2 + VS 2010(C#)

開啟 VS 2010,選擇 新建專案,選擇 ”WCF”|”WCF 服務庫 ”,注意這裡是”WCF 服務庫 ”,不是"WCF 服務應用程式"


確定後,系統會自動建立預設檔案 ” Service1.cs”和” IService1.cs”,其實也是系統給你的示例


開啟"IService1.cs",你可以看到系統給你的示例程式碼,將游標定位到"IService1"上,按F2健,可將介面重命為你想要的名子,重新命名後將解決管理器中檔案也同命修改。我修改為 ”IMyFirstService”;開啟“Service1.cs",按相同方法修改


回到MyFirstService,在這裡我定義了兩個函式"Base64Encrypt"和"Base64Decrypt",請注意格式,[OperationContract]一定要有,否則外部無法訪問

切換到"MyFirstService",介面實現,編寫具體程式碼。


好了,WCF服務庫的程式碼部分就結束了,下面要開始配置,開啟專案下的App.config檔案



這裡,我們主要看system.servicemodel節點,有2體個子節點"services"和"behaviors",其中"behaviors"節點主要是安全和除錯方面的設定,我們不在此討論,主要說一下第1個子節點"services",我們來看一下"services"節點內


估計大多數人和我一樣,這些是什麼亂七八糟的東西,頭大。既然開頭說了,本文只說如何實現,所以不說其所以然了,肯定,這樣的配置無法在後面的宿主裡成功呼叫,為什麼呢,因為缺少了binding的配置,而預設並未生成配置節點,那好我們自己來加,注意標識的地方



配置一下專案屬性,我的生成目錄在F:\WCFTEST,生成專案

好的,WCF服務庫已工作已結束。

開始宿主程式

右擊解決方案,新增|新建專案”Windows”|”Windows 服務”,專案名就預設吧,不改了

在Windows服務專案中新增WCF服務庫的引用




開啟"WindowsService1"專案的App.config,發現什麼都沒有


將“MyTestWcfServiceLibrary”專案中的App.config檔案的內容全部複製過來(即現在2個專案的App.config檔案內容是完全一樣的)

開始編寫Windows服務的程式碼,要先新增system.servicemodel引用,並using


新增服務安裝程式


配置安裝程式




好的,WCF宿主程式也結束了,成生專案

開始編寫客戶端呼叫

右擊解決方案|新增|新建專案|Windows|windows 窗體應用程式,專案名就預設吧(WindowsFormsApplication1),新增2個label,2個textbox,3個button


右擊引用|新增服務引用,服務地址在windows服務專案中App.config檔案中,依次展開找到system.serviceModel|services|service|host|baseAddresses|add節點,baseAddress等於號後的雙引號中的字串即為服務地址,注意如果是生產環境,那麼你服務所使用的埠號在開啟。本例地址為“http://localhost:8732/Design_Time_Addresses/MyTestWcfServiceLibrary/Service1/” 



(下載連線中的教程中此圖使用錯誤,應該是這樣的圖,教程中使用的是在WindowsService1中的服務引用的圖)




此時,服務地址是localhost,所以可以直接引用成功,如果服務地址是一個網路地址,需要在宿主伺服器中將服務啟動後才可以引用服務,否則會提示找不到服務。也就是說如果你的服務地址是http://192.168.1.1:8732/Design_Time_Addresses/MyTestWcfServiceLibrary/Service1/”,,那麼你要先將服務安裝並啟動服務,這樣才可以新增服務引用

客戶端程式碼

設為啟動專案,執行

編碼


解碼



文中所寫的全部在這個下載中(寫了這麼詳細了,如果還沒做出來,那就花點錢吧^_^)