一.進入Asp.net運行時之前
雖然本文的重點是對托管代碼的解析,但為了整個知識點的完整性,這里簡單介紹一下IIS處理請求的一些基本情況。在一個IIS服務器上,你可以設置多個應用程序池(每個應用程序池可以單獨設置允許使用的最大內存數量、CPU使用率、回收工作進程的時間間隔等參數,而且一個應用程序池里面只能使用一個版本的.NET Framework),然后把自己的Web應用分別部署到這些應用程序池中。在默認情況下,每個應用池會有一個工作進程w3wp.exe來維護(如果開通了Web園功能,也可以設置多個工作進程)。每個應用程序(虛擬目錄)在池中都有自己的應用程序域,這些應用程序域都處于這個應用程序池的工作進程的進程空間內。
IIS是通過各種ISAPI的擴展來處理各種類型的應用的。當我們從客戶端提交一個請求過來之后,IIS會根據請求的頁面或者服務的類型,把請求映射到指定的ISAPI擴展。比方說,如果我們需要讓IIS支持perl這樣的服務器端程序(當然,這個移植工作早就有人做過了),我們就需要編寫一個專門處理對perl頁面進行的請求的ISAPI擴展。根據ISAPI的定義(符合這個定義的ISAPI擴展才能和IIS正常交互),在你的擴展中可以包括ISAPI Extension和ISAPI Filter兩大部分。ISAPI Extension是對請求的處理程序,完成和web服務器之間的輸入輸出;而ISAPI Filter則是一些回調接口,你可以通過實現這些接口來介入到整個請求處理的每一步驟,對Authentication,RevolveCache等環節進行控制。另外,ISAPI本身就是在工作進程里運行的,而asp.net運行時也是在工作進程里運行的,所以兩者的交互非常有效率。
對于.aspx頁面,這個擴展就是aspnet_isapi.dll。因為這些ISAPI都是非托管的Win32應用,直接對它們進行改動是比較困難的。所以,為了增強Asp.net運行時的可擴展性,aspnet_isapi.dll本身的功能非常少,我們可以把aspnet_isapi.dll簡單理解為請求信息的路由器,負責把請求從IIS傳送到asp.net運行時。而后面我們將要講到的HttpHandle和HttpModule則分別擔負起了ISAPI Extension和ISAPI Filter的功能,幸運的是,HttpHandle和HttpModule可以由純的托管代碼來實現。