SOA Service 服務的特點:
- 服務是平台和位置無關的。
- 服務是相互隔離的。一個服務的改變不會要求其他服務的改變。
- 服務是通訊協定、格式、傳輸中性的,靈活的。
- 服務是可擴充的。
- 服務行為不是限死的,而是策略可更改和配置的。
WCF的推出背景:
- .NET Remoting: .NET Remoting 提供了一種很有用的方法,用於管理跨應用程式定義域的同步和非同步 RPC 會話,是替代DCOM的實現分布式應用的方案。是微軟較為成熟的.net平台下實現分布式應用的解決方案(一般來說,remoting是和平台相關的,需要客戶和伺服器都是.NET)。當然,.net remoting的宿主Hosting可以是console程式、Winform程式,也可以是IIS,也就是Web service。.net remoting除了支援http和TCP外,還可以通過自訂傳輸協議來進行傳輸通訊。但.net remoting實際上更適合Intranet而不是Internet,因為.net remoting 是MarshByReference的,可以傳變數的引用,直接對伺服器對象操作。速度快。而web service 是MarshByValue的,必須傳對象的值。速度慢,但可以穿透防火牆。
- XML Web Serivce:平台無關,能穿透防火牆,Web Serivce是標準。 分幾個層次:Http傳輸、Xml資料格式、SOAP協議封裝、WSDL描述、UDDI發布。
- MSMQ: 用於建立可靠的、分布式、鬆散串連的、基於訊息通訊的應用程式的開發工具。
Hosting :
和.net Remoting一樣,繼承自System.MarshalByRefObject 的對象必須Host到某一個啟動並執行進程中,他才開始監聽來自Client端的請求,當Client才能通過Proxy遠端調用,Remoting Infrastructure監聽到來自Client端的請求,他會啟用相應的remote Object(我們只考慮Server Activate Object——SAO)。實際上對於WCF Service也需要一個Host環境才有其發揮作用的舞台。就像Remoting一樣,你可以使用任何一種Managed Application——Console Application、WinForm Application、IIS / ASP.NET Application——作為它的Host環境。
在WCF架構圖中可以看到,Activation and Hosting層提供了使得服務可以在哪兒啟動和宿主的服務。 Service可以宿主在其他應用的上下文之中,也可以self-hosted.
- Windows Activation Service:在有運行Windows ActivationService的電腦中,WCF應用可以自動啟動.
- EXE: WCF允許服務以可執行檔運行(.EXE files),例如Winforms,console applications
- Windows Services: WCF允許服務以Windows服務運行.
- COM+: WCF允許服務以COM+應用運行.
Hosting, which means that you will use a built-in hosting environment such as IIS
在hosted環境中,開發人員不必建立host應用,因為WCF服務宿主在IIS中。IIS管理和控制服務的生命週期,包括控制代碼的建立和釋放(記憶體釋放,系統資源的釋放等)。儘管開發人員不必建立host應用,但是開發人員需要建立目錄結構和服務宿主的虛擬目錄。hosted服務的好處是可以利用IIS來監控服務的穩定性,而且可以自動啟動。
Self-Hosting, which means that you will build the host environment yourself
開發人員需要手動建立服務宿主的環境,來負責服務的建立和生命週期,並對服務的所有方面進行控制。例如,定義Endpoint(或通過configuration),建立ServiceHost等。host應用通過ServiceHost類控制服務控制代碼的建立和釋放,使用Open方法來啟動訊息收取,使用Close方法來停止和釋放服務。這種方法提供更多的靈活性。
Host在Managed 程式碼中(例如WinForm applications,console applications, Windows service),部署起來代價更小,靈活性更強
ServiceHost sh;
List<ServiceHost> shs = new List<ServiceHost>();
private void Form1_Load(object sender, EventArgs e)
{
sh = new ServiceHost(typeof(WCFService.ServiceClass));
sh.Open(); // Open host, --- use sh.Close() to close host
}
Links:
[WCF學習筆記] Endpoint
[WCF學習筆記] Binding