[Windows Azure] PDC 2010 新功能 (2): Full IIS

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 應用程式,或是在一個網站下掛載多個虛擬目錄,有助於舊式使用虛擬目錄掛載應用程式的專案搬上雲端來執行。

 

7652.IIS[1]

要讓 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:

New Full IIS Capabilities: Differences from Hosted Web Core