IIS 7.0可以支援兩種管道模式:一種是IIS 7.0最新提供的整合式管線模式,另一種是經典管道模式,這種模式是由先前版本的IIS提供的。我們可以在應用程式集區級設定管道模式,這項功能對IIS管理員尤其有用,因為這樣既可以令一台伺服器僅運行一種模式,也可以令兩種模式同時運行於一台伺服器上。第2章對此進行了比較深入的探討。
上述兩種管道模式使用的web.config檔案存在重大的區別,許多在經典管道模式下能夠正常工作的web.config檔案都無法在整合式管線模式下正常工作。利用AppCmd.exe,我們可以將經典管道模式下的設定檔格式自動轉換為整合式管線模式下的設定檔格式。下面我們將介紹有關內容。
我們有必要首先看看各種模式的結構,並且研究兩種模式之間的區別。
1. 傳統模式
在IIS 6.0中的傳統模式中,ASP.NET是一個添加到IIS中的ISAPI。IIS 7.0之所以支援這種模式,是為了做到向後相容。但是,傳統模式缺少許多整合模式才能提供的特性。在傳統模式中,IIS擁有自身的管道,這些管道可以通過建立一個ISAPI擴充進行擴充,而ISAPI擴充是以難以開發而著稱的。ASP.NET作為一個ISAPI擴充運行,只是IIS管道中的一項組成部分。
圖8-19很好地解釋了上述情況。注意,在這種情況下,ASP.NET似乎是一種類似於馬後炮的成果,僅當IIS處理ISAPI擴充時才能夠發揮作用。
利用副檔名,可以判斷使用哪個ISAPI處理常式。例如,可以將副檔名為.aspx 和.ascx的檔案對應到aspnet_isapi.dll;並且將副檔名為.asp的檔案對應到asp.dll,這樣就可以處理傳統的ASP頁面;此外,將副檔名為.php的檔案對應到php.dll,這樣就可以處理PHP頁面,前提是已經安裝了php.dll。
此外,在IIS 6.0和IIS 7.0的傳統模式中,某些特性是重複的。例如,錯誤處理就是一種重複的特性,因為IIS可以處理非ASP.NET頁面,而ASP.NET可以處理所有將處理常式映射為aspnet_isapi.dll的頁面。
在IIS 6.0中,我們可以將所有檔案類型都映射到ASP.NET,但是這樣做存在一些限制。最大的限制就是如何處理預設文件:一個預設文件僅當在global.asax中或者在一個HTTP模組中被指定為預設文件時,這個預設文件才能夠得到處理。某些自訂的配置需要使用aspnet_isapi.dll處理所有的檔案類型。IIS 7.0可以輕易地解決這個問題。
傳統模式可以在無須修改web.config的前提下運行現有的Web網站,因此,如果使用的Web farm中既包括IIS 6.0伺服器,也包括IIS 7.0伺服器,或者因為某些原因無法將web.config檔案轉換為遵循新文法的web.config檔案,那麼就可以使用傳統模式。
2. 整合模式
利用整合模式,可以將ASP.NET作為IIS的有機組成部分。現在,IIS伺服器的功能被劃分為40多個模組,因此也就將IIS和ASP.NET的功能劃分為不同的組成部分。諸如StaticFileModule、BasicAuthenticationModule、FormsAuthentication、Session、Profile,以及RoleManager等模組都是IIS管道的組成部分。注意,FormsAuthentication、Session、Profile,以及RoleManager原本就是ASP.NET的組成部分,與IIS並無關係。
圖8-20使用模組解釋了IIS管道。這些模組原本是ASP.NET的組成部分,現在已經是IIS管道的有機組成部分。
IIS管道提供了二十多種事件,開發人員可以利用這些事件來擴充Web伺服器的功能。實際上,通過建立定製模組,同時更新applicationHost.config,可以僅使用自訂模組,而無須再使用微軟公司提供的內建模組,我們可以將IIS 7.0中的模組替換為自訂的模組。
3. 兩種模式之間配置的區別
IIS 7.0對設定檔進行了一些修改,Web開發人員可以使用這些修改內容。例如,<system.webServer>節就是這樣一項修改,無論是傳統模式還是整合模式都可以識別<system.webServer>節,同時,<system.webServer>節既可以在applicationHost.config檔案中設定,也可以在web.config檔案中設定。<system.webServer>節既可以控制靜態頁面,也可以控制動態網頁面。即使在傳統模式中,<system.webServer>節也具有重要作用,它可以協助Web開發人員在web.config檔案中設定不同的IIS配置。
在整合模式中,HTTP模組和HTTP處理常式不再定義於<system.web>中,而是定義於<system.webServer>中。如果在整合模式中運行一個包括了HTTP模組或HTTP處理常式的web.config檔案,那麼將會發生失效。幸運的是,微軟公司已經詳細規定了一個編號為500.22的錯誤資訊,這個錯誤資訊說明了如何一步步地遷移web.config檔案(參見圖8-21)。
利用AppCmd.exe工具,可以輕而易舉地完成檔案的遷移工作。為了在Default Web Site上遷移web.config檔案,可以執行以下AppCmd.exe命令:
- AppCmd.exe migrate config "Default Web Site/"
下面是一個web.config檔案的例子,這個例子可以在IIS 6.0的傳統模式下工作:
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
-
- <system.web>
- <httpModules>
- <add type="classname, assemblyname"
- name="modulename" />
- </httpModules>
- </system.web>
-
- </configuration>
AppCmd.exe migrate config命令運行結束後,web.config檔案將被更新為以下內容:
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- <system.web>
- <httpModules>
- <add type="classname,
- assemblyname" name="modulename" />
- </httpModules>
- </system.web>
- <system.webServer>
- <modules>
- <add name="modulename"
- type="classname, assemblyname"
- preCondition="managedHandler" />
- </modules>
- <validation
- validateIntegratedModeConfiguration="false" />
- </system.webServer>
-
- </configuration>
注意,web.config檔案中仍然保留了httpModules節,其目的在於向後相容,但是,在system.webServer中,modules節則處於優先的地位。validateIntegratedMode Configuration屬性可以確保IIS不會因為存在遺留的<httpModules>節而產生問題。
整合式管線模式是預設的管道模式,具有一些比較重要的優勢。我們需要做的就是遷移定義了HTTP處理常式和HTTP模組的所有web.config檔案,從而確保其能夠在IIS 7.0下正常工作。