Full IIS 模式可讓 Windows Azure 的 Web Role 可掛載多個 Web 應用程式,並且允許開發人員進一步設定 IIS 的功能設定。
以往在 Windows Azure 上使用 Web Role 架設 Web Application 時,雖然 Web Role 本身搭載的是 IIS 7.0,但是傳統的 IIS 7 的功能卻無法使用,一個 Web Role 上只能使用一個 Web Application,這對於具有在單一網站上使用多個應用程式 (Virtual Directory) 的 Web Application 來說是個不小的問題。
Web Role 無法架設多網站的根本原因,是初期的 Web Role 中真正掛載 Web 應用程式的執行期元件是 Hosted Web Core (HWC) 引擎,它借用 IIS 的一部份來處理,執行 Web Role 的引擎是 WaWebHost.exe,這是相容於 Development Fabric 的執行作法,Web Role 的 RoleEntryPoint 的 OnStart 事件處理常式是執行於 WaWebHost.exe。而 Full IIS 模式,就是將 Web Application 的執行引擎交給真正的 IIS 來做,角色本身的 RoleEntryPoint 改由 WaIISHost.exe 來執行,由 WaIISHost.exe 將 WebRole.dll 載入後,將控制權移交給 IIS (w3wp.exe) 來做,也因為如此,Web Role 在 Full IIS 的加持下,可以同時執行多個 Web 應用程式,或是在一個網站下掛載多個虛擬目錄,有助於舊式使用虛擬目錄掛載應用程式的專案搬上雲端來執行。
要讓 Web 應用程式支援 Full IIS 模式,必須要以 Windows Azure SDK v1.3 建置雲端專案,並在 ServiceDefinition.csdef 中加入 IIS 的相關設定,這些設定與在本地中設定網站或虛擬目錄結構,例如:
<Sites>
<Site name="Web">
<VirtualApplication name="WebAppA" physicalDirectory="C:\Projects\WebAppA\" />
<Bindings>
<Binding name="HttpIn" endpointName="HttpIn" />
</Bindings>
</Site>
<Site name="AnotherSite" physicalDirectory="C:\Projects\AnotherSite">
<Bindings>
<Binding hostHeader="anothersite.example.com" name="HttpIn" endpointName="HttpIn"/>
</Bindings>
</Site>
</Sites>
IIS 7.x 中本來就支援利用 XML 來定義網站與目錄結構的功能,在 Full IIS 的模式下,開發人員可以完全的利用這個功能,在 Web Role 上架設與組態一個或多個網站 (與虛擬目錄),而應用程式更可以利用 PDC 2010 的另一項新功能:Admin Mode (Evelated Privilege) 在 Web Role 中安裝一些必要元件 (例如 PHP/SQL Server Driver for PHP 等,這個部份我會另開報導文章):
<?xml version="1.0" encoding="utf-8"?> <ServiceDefinition name="IIS_Demo" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> <WebRole name="MyWebRole"> <Startup> <Task commandLine="ConfigureIIS.cmd" executionContext="elevated" taskType="simple" /> </Startup> <Sites> <Site name="Web"> <Bindings> <Binding name="HttpIn" endpointName="HttpIn" /> </Bindings> </Site> </Sites> <Endpoints> <InputEndpoint name="HttpIn" protocol="http" port="80" localPort="80" /> </Endpoints> </WebRole> </ServiceDefinition>
不過,雖然 v1.3 開始,Web Role 支援了 Full IIS 模式,但仍然相容於原有的 Web Role 執行模型,只要把 <Site> 的宣告設定移除即可。
Reference: