原文地址:http://blog.csdn.net/yuanchunze/article/details/7242437
Web Role主要是用來處理HTTP或HTTPS請求的,顯然這是最為重要的一個角色。目前在Window Azure中的Web Role執行個體運行在一個包含IIS的虛擬機器中。Web Role可以用來構建Web應用和Web服務。開發人員可以使用像ASP.NET、WCF等.NET技術,也可以使用像PHP這樣可以通過IIS的 FastCGI功能模組支援的非.NET技術來建立Web Role服務。雖然其它角色如worker Role 也可以通過設定來偵聽HTTP和HTTPS請求,但是Web Role是預設支援並且是專門設計來處理這些web請求的。如果一個服務包含多個Web Role,那麼它們需要採用不同的HTTP和HTTPS連接埠。
理解Web Role
從角色定位的角度來看,Web Role主要用來構建Web應用和基於WCF的Web服務。與Worker Role相比,Web Role主要是多了對IIS的支援。Windows Azure會維護和配置包括IIS在內的服務運行環境,開發人員只需要按照Web Role的編程要求構建應用,Windows Azure就能夠完成應用所有的自動化部署和配置。
Web Role項目結構是怎樣的呢?對於熟悉傳統的基於IIS的Web應用編程的開發人員來說,構建Web Role服務將是一個相對簡單的工作,因為Web Role服務實現的主要組成部分與傳統Web應用非常相似。如果使用Visual Studio的Web Role 模版建立項目,那麼這個項目中會自動包含三個與Windows Azure 相關的引用。
1、Microsoft.WindowsAzure.Diagnostics 主要包含診斷和日誌相關的類;
2、Microsoft.WindowsAzure,ServiceRuntime 主要包含與角色執行個體生命週期控制以及配置資訊訪問相關的編程介面類;
3、Microsoft.WindowsAzure.StorageClient 主要包含使用REST 方式訪問 Windows Azure 儲存,包括 Blob、Table和Queue等的類。
開發人員自然可以通過 Visual Studio 提供的Web Role 模版建立一個新的Web Role 應用,但如果使用者已有一個傳統的 Web應用,那麼能否把它轉換成一個Web Role 應用呢?答案是肯定的。從項目結構上看,這個轉換操作相對簡單,但是如果需要應用Windows Azure的一些特性,就需要根據它的編程介面進行調整。Windows Azure 角色在狀態儲存、資料存放區等方面有一些特殊要求。
實際上,Windows Azure 項目上主要是包含了服務模型的資訊以及項目之間的關聯資訊,具體的服務邏輯都是由各個角色項目來實現的。從項目依賴關係來看,Windows Azure 項目需要依賴它所包含的那些角色項目。
瞭解Web Role 運行環境
大部分開發人員都是從Web Role 開始進行 Windows Azure 編程的,因此進一步瞭解 Web Role 的細節有助於理解 Windows Azure 的計算服務。接下來我們看一下 Web Role 執行個體具體的運行環境,它包括底層的虛擬機器、IIS服務等。
在Windows Azure剛發布時, Web Role 的運行環境對外就像一個黑盒了。因為內部運行環境的細節沒有對外公布。Web Role 那時候只支援Managed 程式碼,而且只能運行在部分信任模式下;開發人員也沒有一個簡單的方式來瞭解 Web Role 執行個體的具體運行環境的情況。但是微軟後來發布了 Windows Azure 的一些新特性,比如代碼完全信任設定和管理員模式中的遠端桌面等,都可以協助開發人員瞭解不同角色執行個體(包括 Web Role)的運行環境。
現在 Windows Azure 的角色可以設定運行在完全信任模式下,比如對於 Web Role,開發人員只需要在相應服務定義檔中進行如下設定即可。
[html] view plaincopyprint?
- <WebRole name="WebRole1" endableNativeCodeExecution\"true">
完全信任模式下使幾種代碼訪問情境稱為可能。
1、調用非.NET代碼。除了Managed 程式碼之外,許多開發人員已經寫了許多本地代碼,尤其在處理一些特殊任務時。完全信任設定使得服務角色可以通過建立新的進程或通過平台叫用服務方式調用本地代碼。
2、使用一些需要完全信任.NET庫。Windows Azure 原先不能調用那些需要完全信任許可權的.NET庫,現在就沒有這個限制了。
3、通過具名管道進行處理序間通訊。如果服務建立了不同的進程,現在則可以通過具名管道讓它們進行通訊。
實際上,讓角色可以建立本地進程是 Windows Azure
支援不同語言環境的一個重要前提,後面我們會發現在配置PHP支援時就需要設定完全信任存取權限。另外,需要注意的是,雖然有了完全信任許可權,但是角色服
務在 Windows Azure
上並不是以管理員身份啟動並執行,因此在有一些資源如註冊表等的修改上還是有一些限制的。這是從安全形度出發進行的必要限制。
那如何瞭解 Web Role 執行個體運行環境的一些資訊呢? 我們知道,在通常的 Windows
環境中可以通過命令列的方式執行一些命令來瞭解系統內容。完全信任模式可以讓開發人員在Web Role
角色中通過System.Diagnostics.Process類產生與一個 cmd.exe
進程,然後把需要執行的命令作為參數傳遞給它並把命令執行結果返回給用戶端。另外,開發人員還可以通過System.Environnment 類和
Microsoft.Win32.Registry 類來得到環境的一些具體資訊。
Windows Azure 提供的遠端桌面使得開發人員有一個更為直觀的方式來瞭解角色環境。在 Visual Studio 中為服務角色配置遠端桌面訪問的步驟比較簡單,只需要在發布應用時選擇配置遠端桌面連線
然後在配置視窗中為遠端桌面設定相應的使用者們和口令即可。在這個過程中 Visual Studio
會自動產生一個認證,並且自動修改相應的服務定義檔和服務組態檔。開發人員可以通過 Windows Azure
管理入口網站網站把上面步驟中產生的認證上傳到對用服務的認證目錄中。
在服務定義檔中主要是對<Imports>元素,它描述了需要為角色運行環境增加的匯入模組。這是在 Windows
Azure SDK 版本 1.3以後增加的一個新功能。 在 Web Role 中與遠端桌面連線相關的<Imports>設定主要是對
RemoteAcess模組和RemoteForwarder模組,如下所示。
- <Imports>
- <ImportmoduleNameImportmoduleName="Diagnostics"/>
- <ImportmoduleNameImportmoduleName="RemoteAccess"/>
- <ImportmoduleNameImportmoduleName="RemoteForwarder"/>
- </Imports>
RemoteAcess表示當前角色支援遠端桌面訪問,RemoteForwarder表示當前 Web Role 支援RDP訪問的轉寄,因為使用者服務中的不同角色不能都對外直接開放RDP訪問連接埠。
遠端桌面訪問的具體配置資訊如使用者登入資訊、認證的職位等被自動定義在服務組態檔中。如下所示。
- <ConfigurationSettings>
- <Setting name="Microsoft.WindowsAzure.Piugins.Diagnostics.ConnectionString" value="UseDevelopmentStorage=true"/>
- <Setting name="Microsoft.WindowsAzure.Piugins.RemoteAccess.Enabled" value="true"/>
-
- <Setting name="Microsoft.WindowsAzure.Piugins.RemoteAccess.AccountUsername" value="LoginName"/>
- ......
配置好遠端桌面連線之後,開發人員就可以在Windows
Azure管理入口網站網站中直接通過RDP串連相應的角色執行個體了。開發人員可以具有管理員權限,從而可以通過熟悉的 Windows Server
管理介面來詳細瞭解角色執行個體的運行環境。比如,可以在資源管理員中看到 Web Role 的目錄結構。