在 IIS 7.5 中,應用程式集區有兩種運行模式:整合模式和傳統模式。
應用程式集區模式會影響伺服器處理Managed 程式碼請求的方式。
如果託管應用程式在採用整合模式的應用程式集區中運行,伺服器將使用 IIS 和 ASP.NET 的整合請求處理管道來處理請求。
如果託管應用程式在採用傳統模式的應用程式集區中運行,伺服器會繼續通過 Aspnet_isapi.dll 路由Managed 程式碼請求,其處理請求的方式就像應用程式在 IIS 6.0 中運行一樣。
傳統模式:
指的是與IIS 6或者之前版本保持相容的一種模式,一個典型問題就是,在處理ASP.NET這種動態網站的時候,它是通過一個所謂的ISAPI程式,作為外掛程式的方式來工作的。針對不同的Live App程式(例如ASP,PHP等),會需要不同的ISAPI。
整合模式:
這種全新的模式,允許我們將ASP.NET更好地與IIS整合,甚至允許我們在ASP.NET中編寫一些功能(例如Module)來改變IIS的行為(擴充)。整合的好處是,不再通過ISAPI的方式,提高了速度和穩定性。至於擴充,則可以使得我們對於IIS以及其他類型的請求有更多的控制。
升級過程中出現了比較多的問題,前面文章也提到過幾個。這次就主要介紹下httpHandler 和 httpModule 在整合和傳統模式下的區別。很多檔案上傳等都是需要使用到httpModule去實現。我今天就出現了NeatUpload在iis7.5下出現未將對象引用到設計執行個體的錯誤。所以用httpModule作為測試案例。
1.建立測試網站WebApplication,加入MyHttpModule類實現IHttpModule介面,主要目的是測試程式是否經過了HttpModule,經過的在頁面輸出HttpModule字元。
public class MyHttpModule : IHttpModule { public void Dispose() { } public void Init(HttpApplication context) { context.BeginRequest += context_BeginRequest; } protected void context_BeginRequest(object sender, EventArgs e) { var context = sender as HttpApplication; context.Response.Clear(); context.Response.Write("HttpModule"); context.Response.End(); } }
2、2.在IIS7.5部署網站,首先使用傳統模式應用程式集區。在web.config的 <system.web> 的子節點<httpModules> 加入<add name="MyHttpModule" type="WebApplication.MyHttpModule, WebApplication"/>
<httpHandlers> <remove verb="*" path="*.asmx"/> <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/> </httpHandlers> <httpModules> <add name="MyHttpModule" type="WebApplication.MyHttpModule, WebApplication"/> <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </httpModules>
訪問網站可以發現頁面輸出如下,說明程式經過了HttpModule
直接切換應用程式集區成整合模式會發現頁面輸出為空白。證明程式沒有經過HttpModule。那在整合模式下HttpModule如何才能執行呢? 之前部署URLRewriter的時候查資料只知道需要 <system.webServer> <modules>註冊HttpModule。仔細查看設定檔會發現有一段如下英文.意思大概就是iis7版本的設定。之前版本無需設定。
<!--
The system.webServer section is required for running ASP.NET AJAX under Internet
Information Services 7.0. It is not necessary for previous version of IIS.
-->
這樣就大概明白意思是iis7.0之後有部分web配置移動到system.webServer中。查閱相關得到答案確實如此 詳細資料見 http://www.cnblogs.com/buaaboyi/archive/2011/01/20/1939903.html
於是在<system.webServer> <modules>中加入配置如下,重新整理頁面,頁面能夠輸出字元HttpModule,證明成功了。
<system.webServer> <validation validateIntegratedModeConfiguration="false"/> <modules> <remove name="ScriptModule" /> <add name="MyHttpModule" type="WebApplication.MyHttpModule, WebApplication"/> <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </modules>
由於在升級過程成有一個網站出現 HTTP 錯誤 500.22 - Internal Server Error 檢測到在整合的託管管道模式下不適用的 ASP.NET 設定
當時在比較急的情況下就直接刪除了 <system.web> 的子節點<httpModules> 程式正常運行。後面通過仔細和正常的網站對比是發現是缺少 <validation validateIntegratedModeConfiguration="false"/> 這個導致,這個主要作用是設定不檢測 <system.web>中的配置
經過這今天的折騰終於是對iis7.5上的部署有了一定瞭解了。