裝載 WCF 服務

WCF(Windows Communication Foundation)服務必須寄人籬下,住在某個房東的家裡。這個房東是一個 Windows 處理序,我們稱它為 host process。把一個 WCF 服務放進一個 host process 中運行,這個動作叫做「裝載」(hosting)。一個 host process 可以裝載多個 WCF 服務,而且裝載的方式有好幾種,包括:使用 IIS 裝載、使用 WAS(Windows Process Activation Service)、或 WAS 加 Windows Server AppFabric,或者自行撰寫裝載的應用程式。

自主裝載

自主裝載(self-hosting)就是由開發人員自己提供可裝載服務的應用程式,並管理其生命週期。自主裝載的應用程式可以是個 Windows Forms 應用程式、WPF 應用程式、Console 應用程式、或 Windows 服務。

要注意的是,選擇自主裝載 WCF 服務時,除了 Windows 服務或 in-proc 呼叫(用戶端和服務位於同一個 process)的情況之外,其他的自主裝載方式都必須在用戶端呼叫之前就事先啟動 host process,否則就無法接收到用戶端發出的請求。

自主裝載的 WCF 服務可使用任何 WCF 支援的傳輸協定(不像裝載於 IIS 5/6僅支援 HTTP/HTTPS),而且可以使用 WCF 的全部功能,例如:服務匯流排、服務探索等等。

裝載於 IIS 5/6

裝載於 IIS 的好處是 host process(w3wp.exe)會在用戶端第一次發出請求的時候自動啟動,而且 IIS 5/6 會自動管理 host process 的生命週期。缺點則是只能使用 HTTP。若是 IIS 5,則還有一個限制:所有的服務都只能使用同一個埠號。

在 IIS 中裝載 WCF 的動作就跟裝載 ASMX web service 一樣,只要在 IIS 中建立一個虛擬目錄,並在目錄中提供一個 .svc 檔案就行了。

WAS 裝載

將 WCF 服務裝載於 IIS 5/6 的主要問題在於,它是個 web 伺服器,而不是專門用來裝載應用程式的引擎。因為這個緣故,ASP.NET 還要幫你處理 HTTP 模組和 ASP.NET 管線的部分,因而增加了內部處理的複雜度。另一個限制是,IIS 5/6 只接受 HTTP 請求。

微軟對此問題的應對之道,是提供一個通用的裝載引擎,叫做 Windows Process Activation Service,簡稱 WAS。WAS 是一個系統服務,只在 Windows Vista、Windows Server 2008、Windows 7(或後續版本)的作業系統才有提供。

作為通用的裝載引擎,WAS 不僅可以裝載網站(IIS 7 預設就是將網站裝載於 WAS),也可以裝載你自行撰寫的服務,而且支援多種傳輸機制,例如:TCP、IPC、MSMQ。

WAS 可以和 IIS 7 分開安裝與設定,以 Windows 7 為例,開啟「控制台」的「程式和功能」,然後點左方面板的「開啟或關閉 Windows 功能」,裡面有一項「Windows 處理序啟用服務」就是 WAS。

將 WCF 服務裝載於 WAS 的動作就跟裝載於 IIS 5/6 一樣,只要提供 .svc 檔案或設定正確的組態檔就行了。由於 WAS 是系統服務,因此你不用預先啟動服務裝載處理序。每當第一個用戶端的呼叫送達,WAS 會攔截到,接著啟動一個 worker process 來裝載你的服務,然後將呼叫轉送給你的 WCF 服務。

WAS + Windows Server AppFabric

前面提過,WAS 是一個通用的裝載引擎,而這也正是它的限制所在:它根本不知道自己裝載的程式究竟是個 WCF 服務,還是 ASP.NET 網站。因此,它也不會特別為 WCF 服務提供最佳化的處理。為了加強 WAS 既有的功能,你可以安裝一個叫做 Windows Server AppFabric 的 WAS 擴充元件。Windows Server AppFabric 必須運行於 IIS 7 與 .NET 4 之上,亦即作業系統須為 Windows 7、Windows Server 2008 SP2  或 R2 以上的版本。此擴充元件的用途是為 WCF 服務與 Workflow(WF)服務提供額外的組態設定、事件追蹤、以及監控、管理等功能。其實,Windows Server AppFabric 的設計比較偏重於對 WF 服務的支援,像是儲存機制(persistence)與狀態管理等功能。

你可以到微軟官方網站下載並安裝 Windows Server AppFabric,網址是 http://www.microsoft.com/download/en/details.aspx?id=15848。安裝完成後,Windows Server AppFabric 會在「IIS 管理員」中加入一些監控與管理服務的項目,以及 WCF 和 WF 的組態項目。如下圖所示:


圖中的「AppFabric 儀表板」可用來監控執行中的 WCF 和 WF 服務,其功能類似早期的 COM+ 元件服務管理員。你可以利用此儀表板來查看 WCF 服務和 WF 服務的執行狀況,並診斷呼叫失敗的原因。

WCF 開發人員應該會很高興聽到 Windows Server AppFabric 有提供自動啟動服務的功能。若沒有 Windows Server AppFabric,WAS 就只會在第一個用戶端請求送達時才啟動你的 hosting process(用戶端因而會有短暫延遲的現象)。

設定自動啟動的操作方式可參考這篇官方文件:使用 IIS 管理員來設定自動啟動功能

選擇裝載方式

你可以從官方文件 Hosting Services 中找到各種裝載方式的比較。底下針對用戶端會來自四面八方(即 Internet)的情況,簡單說明如何選擇裝載方式:
  • 如果你需要自動啟動服務或服務匯流排(service bus)的功能,最好的選擇是 WAS + AppFabric 裝載,也就是需要 IIS 7.5(Windows 7、Windows Server 2008 R2)加 .NET 4。註:服務匯流排是一種服務轉介(relaying)的架構。
  • 若作業環境為 IIS 7(Windows Vista、Windows 7、Windows Server 2008),但不需要自動啟動,還是可以使用 WAS + AppFabric 裝載。若需要使用服務匯流排,就選擇自主裝載,否則採用 WAS 裝載。
    注意:web server 管線處理模式必須是 Integrated mode(不可以是 Classic mode),否則不支援 WAS 啟動。
  • 若為 IIS 5/6,那就沒別的選擇,只能裝載於 IIS 5/6 了。

參考資料:Programming WCF Services 3rd Edition, O'Reilly (Aug. 2010)
===========================
後記 (Sep-13-2011):

經 Vivid 老師指正,Windows Server AppFabric 其實也可以裝在 Windows Server 2008 上面,而不是非得 Windows Server 2008 R2 不可。後來至官網爬文,發現的確如此。然後自己裝了個 Windows Server 2008 的虛擬機器,實際測試結果如下:
  • Windows Server 2008 沒有安裝 Service Pack 2:不能裝 Windows Server AppFabic。
  • Windows Server 2008 with Service Pack 2:可以裝 Windows Server AppFabic 6.0,但不能裝 6.1 版。
原來,官網的 Windows Server AppFabric 下載頁面提供 6.0 和 6.1 兩種版本的區分在此!6.1 版只能裝在 Windows 7 和 Windows Server 2008 R2 上面。若搞錯版本,安裝時就會出現下面的錯誤訊息:


在 Windows Server 2008 SP2 上安裝完 AppFabric 6.0 之後,看看有沒有自動啟動服務的功能....答案是沒有:


延伸閱讀

4 則留言:

  1. Windows Server AppFabric 可以裝在IIS 7 (Windows Server 2008) ,OS不一定要Windows Server 2008 R2版本也可以喔

    回覆刪除
  2. 挖哩! 一時不察。已經修正了,多謝 ^_^

    (Juval Lowy, 我一直那麼相信你,沒想到...下次還是到官網查證一下技術細節比較妥當)

    回覆刪除
  3. 原來 AppFabric 可以裝在 Windows Vista/7/Server 2008 等作業環境,但依 IIS 版本和 .NET Framework 版本的不同,在功能上也會有差異。這篇: http://msdn.microsoft.com/en-us/library/ee677368.aspx
    裡面提到,「自動啟動」的功能必須在 Windows 7 或 Windows Server 2008 R2 才有。這還真是挺細的 Orz

    回覆刪除
  4. 弄了個 Windows Server 2008 虛擬機器,實際測試一下。把測試結果補在正文後面了。
    希望這次沒錯啦! ^_^

    回覆刪除

技術提供:Blogger.
回頂端⬆️