WCF託管服務和客戶端代理

 

參考文章:http://www.cnblogs.com/wayfarer/archive/2008/01/02/1022967.html

 

WCF的典型宿主(託管服務的方式)包括以下四種:
1、"Self-Hosting" in a Managed Application(自託管宿主)
2、Managed Windows Services(Windows Services宿主)
3、Internet Information Services(IIS宿主)
4、Windows Process Activation Service(WAS宿主)

 

1、自託管宿主
利用WCF提供的ServiceHost<T>提供的Open()和Close()方法,可以便於開發者在控制檯應用程序,Windows應用程序乃至於ASP.NET應用程序中託管服務。
using (ServiceHost host = new ServiceHost(...)) { host.Open(); ... }

由於ServiceHost實例是被創建在應用程序域中,因此我們必須保證宿主進程在調用服務期間不會被關閉,因此我們利用Console.Read()來阻塞進程,以使得控制檯應用程序能夠一直運行,直到認爲地關閉應用程序。如果是Windows應用程序,則可以將創建ServiceHost實例的代碼放在主窗體的相關代碼中,保證服務宿主不會被關閉。
在通常的企業應用中,我們很少會採用自宿主方式託管服務,這是因爲這種方式必須要在應用程序運行下,客戶端才能夠調用服務,且並不便於隨時啓動和停止服務。除了不具有易用性與易管理性之外,在可靠性、性能等諸多方面受到很多限制。但由於它簡單、易於實現,因而往往用於開發期間的調試或演示環境。

自託管宿主支持所有的綁定。

 

2、Windows Services宿主

Windows Services宿主則完全克服了自託管宿主的缺點,它便於管理者方便地啓動或停止服務,且在服務出現故障之後,能夠重新啓動服務。我們還可以通過 Service Control Manager(服務控制管理器),將服務設置爲自動啓動方式,省去了服務的管理工作。此外,Windows Services自身還提供了一定的安全性以及檢測機制和日誌機制。

Windows Services宿主的實現也非常簡單。我們可以在Visual Studio中創建Windows Services項目。在創建項目之後,就可以創建一個繼承了System.ServiceProcess.ServiceBase類的Windows服務類。Windows服務類繼承了ServiceBase類的OnStart()和OnStop()方法,完成Windows服務的啓動與停止。我們可以重寫這兩個方法,將ServiceHost的啓動與關閉對應地放入這兩個方法的實現中。

這種方式唯一的缺點卻是對宿主的部署相對比較複雜,必須通過.NET提供的Installutil.exe工具完成對服務宿主的安裝(也可以通過安裝包的自定義操作完成)。

 

安裝服務:在設計器視圖下,右鍵,選擇“添加安裝程序”,在安裝程序項目中添加Installer的代碼(參考文章),定義服務名稱即ServiceInstaller對象的ServiceName。編譯生成,把bin下的“項目名.exe”拷到VS2008命令行工具所在目錄(如:C:\Program Files\Microsoft Visual Studio 9.0\VC>)下。運行installutil 項目名.exe。輸入管理員角色的用戶名(計算機名\用戶名)和密碼。安裝完成後,運行Services.msc,可以看到自定義的服務已經存在了。

 

3、IIS宿主(說明,這裏講的IIS爲IIS 6.0)

若要使用IIS宿主,需要爲程序集中添加一個svc文件。我們可以通過爲項目添加一個新項的方式添加svc文件。我們也可以直接創建一個WCF Service應用程序作爲IIS宿主,它會自動創建一個svc文件。在svc文件中嵌入WCF服務的代碼,完成後發佈到IIS目錄即可。瀏覽其中的svc文件,點擊wsdl鏈接可以查看到服務的WSDL信息

IIS 宿主是一種主要的服務託管方式,這是因爲它具有易用性、可維護性、安全性、易於部署等多個優勢。然而,它卻具有一個致命的缺點,那就是它只支持 HTTP協議的傳輸綁定。特別對於局域網場景下,如果使用IIS宿主,就無法利用TCP傳輸的高效率,甚至無法使用MSMQ以及Peer to Peer傳輸。IIS 7.0(基於Windows Vista和Windows Server 2007)提供的Windows激活服務(WAS)突破了IIS 6.0對於HTTP的依賴。

 

4、WAS宿主
WAS是IIS 7.0的一部分,但也可以獨立地安裝與配置。WAS支持所有可用的WCF傳輸協議、端口與隊列。
利用WAS託管服務與IIS宿主託管服務的方法並沒有太大的區別,仍然需要創建svc文件,同時在IIS中需要在站點中創建應有程序指向託管應用程序,還可以設置訪問服務的別名與應用程序池。
由於WAS訴諸支持所有的綁定,因此此時的服務綁定並不會受到宿主的限制。


創建客戶端代理:

A。通過channel factory對象手動創建
B。通過工具創建SvcUtil,不推薦使用
C。在Visual Studio中通過在服務端發佈元數據,在客戶端可以通過添加服務引用自動生成。

 

第一種方法,使用channel factory對象創建代理,爲此你需要提供地址、綁定和服務契約。新建wcf服務類庫WcfServiceLibrary,添加服務契約HelloWcfService。
Service端:
//使用基地址和服務類型創建ServiceHost實例
using (ServiceHost host = new ServiceHost(typeof(WcfServiceLibrary.HelloWcfService), new Uri("http://localhost:8000/MyUrlAddr")))
{
    host.AddServiceEndpoint(typeof(WcfServiceLibrary.IHelloWcf), new BasicHttpBinding(), "MyService");   //用編碼方式添加服務端點
    host.Open();    //Console.Write("host open.");    //Console.ReadLine();
}
Clinet端:
EndpointAddress ep = new EndpointAddress("http://localhost:8000/MyUrlAddr/MyService");  // //創建一個端點地址對象
IHelloWcf Proxy = ChannelFactory<IHelloWcf>.CreateChannel(new BasicHttpBinding(), ep);  //創建服務的客戶端代理
string getValue = Proxy.HelloWcf();  //客戶端通過代理調用WCF服務

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章