1. 程式人生 > >對IIS7經典模式和整合模式的理解

對IIS7經典模式和整合模式的理解

IIS6新增應用程式池的概念,到現在IIS7,對HTTP請求處理功能已經越來越精確化和不斷改善,IIS7應用程式池新增了經典模式和整合模式可供選擇,不管官方還是一些書籍或文章都有介紹,但多數過於官方話,下面白話一下我對經典模式和整合模式的理解,希望能對自己以後和其他人更貼切的參考。涉及IIS解析ASP.NET的生命期等知識我就簡單過一下,書籍和網路介紹的都比較多,本篇文章主要講下我對經典模式和整合模式理解的區別和應用。

先直接看一個結果,再分析原因。編寫一個最簡單的網站,和一個最簡單的HttpModule

程式結構如上,第一個ModuleIISTests是一個網站,裡面包括aspx

htm檔案,default.aspx檔案內容為空,a.htm檔案內容為aaaaaa,下面一個TestIISModule是一個類庫,TModule.cs是繼承自IHttpModule的一個自定義的HtppModule,主要程式碼如下:

        public void Init(HttpApplication context)

        {

            context.BeginRequest +=new EventHandler(context_BeginRequest);

        }

        public void context_BeginRequest(object

 sender, EventArgs e)

        {

            HttpApplication application = (HttpApplication)sender;

            application.Response.Write("test module lawson");

        }

然後配置網站的web.config如下:

。。。

      <httpModules>

        <add name="myModule" type="TestIISModule.TModule,TestIISModule"/>

      </httpModules>

。。。

    </system.web>

注意:這裡是在system.web節點下。然後掛接IIS:

我添加了網站MyModule指向剛才程式開發的網站,引用程式池用的.net2.0經典模式,分別訪問default.aspxa.htm

Default.aspxmodule攔截了,輸出了文字內容,但a.htm還是保持檔案內容不變輸出。

現在更改下web.config,首先刪除剛才system.web節點下的httpModule節點,配置如下:

。。。

      <modules>

        <add name="myModule" type="TestIISModule.TModule,TestIISModule"/>

      </modules>

。。。

</system.webServer>

注意:這裡是在system.webServer節點下配置的,IIS整合模式下會讀取該大節點下的modules,handlers等節點,然後把應用程式池改為整合模式,再重新整理IIS,重新訪問如下:

Default.aspx還是被攔截到了,但是這裡a.htm也被攔截了。

擷取微軟官方一篇文章的圖,介紹IIS7整合管道下的事件生命週期如下:

從該生命週期可以看出,整合模式下不管託管程式碼還是本機程式碼,都可以在身份驗證和執行處理程式被插入到核心程式碼的託管程式碼攔截。在IIS6下,要想攔截本機程式碼,比如Htm檔案,需要編寫WIN32的非託管程式碼,但它也保留擴充套件的ISAPI,我們可以寫託管程式碼攔截託管檔案的請求。雖然IIS6也可以通過IIS插入ISAPIaspnet_isapi.dll的擴充套件,處理對htm檔案的攔截,但它實際會走兩個通道,首先是IIS內部的本機程式碼攔截,然後是託管程式碼ISAPI的攔截。經典模式就是為了保留和IIS6一樣的處理方式,以前開發的程式碼,可以方便的移植到IIS7上。

IIS7整合模式還增加了MapRequestHandlerLogRequest  PostLogRequest 事件,如果在經典模式下加了這些處理事件,會丟擲:此操作要求使用 IIS 整合管線模式。如果整合模式下不讓IIS處理不相容整合模式的配置以及處理方式,可以在web.config中配置:

 <system.webServer>

    <validation validateIntegratedModeConfiguration="false" />

 </system.webServer>即可。

實際上IIS7整合模式,就是讓使用者可以通過編寫託管程式碼的handler等,把託管程式碼插入到IIS核心程式碼中來解析,方便大家精確控制任意請求,帶來更好的擴充套件性。但缺點呢,我認為整合模式,任何檔案請求都可能經過託管程式碼處理,別人不想把類試圖片和靜態檔案用託管程式碼處理,就得想其他辦法了,這樣會不會內部效率降低,但這都是個人觀點。

上面簡單白話了一下我對IIS7整合模式和經典模式的理解,可能有表述不對的地方,歡迎拍磚。