首先我們來說一下Asp.net工作原理。
具體描述下這樣的:首先客戶請求WEB頁。然后WEB服務尋找指令文件(.aspx),而這時就是aspnet_isapi.dll這個動態連接庫來處理。接著Asp.net代碼被發送到公共語言運行時進行編譯。接著HTML流返回給瀏覽器和令。最后由瀏覽器處理HTML并顯示頁面。
什么是ISAPI呢?
在Internet時代的開端,客戶端的需求非常有限;.htm文件就可以滿足他們的需求。但是,隨著時間的流逝,客戶端需求的擴充超越了.htm文件或靜態文件所包含的功能。
開發者需要擴充或擴展Web服務器的功能。Web服務器廠商設計了不同的解決方案,但是都遵循同一個主題“向Web服務器插入某些組件”。所有的Web服務器補充技術都允許開發者建立并插入組件以增強Web服務器的功能。微軟公司提出了ISAPI(Internet服務器API),網景公司提出了 NSAPI(網景服務器API)等等。ISAPI是一種重要的技術,它允許我們增強與ISAPI兼容的Web服務器(IIS就是一種與ISAPI兼容的 Web服務器)的能力。我們使用下面的組件達到這個目的:
1,ISAPI擴展:ISAPI擴展是使用Win32動態鏈接庫來實現的。你可以把ISAPI擴展看作是一個普通的應用程序。ISAPI擴展的處理目標是http請求。
2,ISAPI過濾器:客戶端每次向服務器發出請求的時候,請求要經過過濾器。客戶端不需要在請求中指定過濾器,只需要簡單地把請求發送給Web服務器,接著Web服務器把請求傳遞給相關的過濾器。接下來過濾器可能修改請求,執行某些登錄操作等等。
ASP.NET請求的處理過程:
ASP.NET請求處理過程是基于管道模型的,在模型中ASP.NET把http請求傳遞給管道中的所有模塊。每個模塊都接收http請求并有完全控制權限。模塊可以用任何自認為適合的方式來處理請求。一旦請求經過了所有HTTP模塊,就最終被HTTP處理程序處理。HTTP處理程序對請求進行一些處理,并且結果將再次經過管道中HTTP模塊。
ISAPI的篩選器:
IIS本身是不支持動態頁面的,也就是說它僅僅支持靜態html頁面的內容,對于如.asp,.aspx,.cgi,.php等,IIS并不會處理這些標記,它就會把它當作文本,絲毫不做處理發送到客戶端。為了解決這個問題。IIS有一種機制,叫做ISAPI的篩選器,它是一個標準組件(COM組件)。
Asp.net服務在注冊到IIS的時候,會把每個擴展可以處理的文件擴展名注冊到IIS里面(如:*.ascx、*.aspx等)。擴展啟動后,就根據定義好的方式來處理IIS所不能處理的文件,然后把控制權跳轉到專門處理代碼的進程中讓這個進程開始處理代碼,生成標準的HTML代碼,生成后把這些代碼加入到原有的Html中,最后把完整的Html返回給IIS,IIS再把內容發送到客戶端。
HttpModule:
HttpModule實現了ISAPI Filter的功能,是通過對IhttpModule接口的繼承來處理。
HTTP模塊是實現了System.Web.IhttpModule接口的.NET組件。這些組件通過在某些事件中注冊自身,把自己插入ASP.NET請求處理管道。當這些事件發生的時候,ASP.NET調用對請求有興趣的HTTP模塊,這樣該模塊就能處理請求了。
HttpModule的實現:
1. 編寫一個類,實現IhttpModule接口。
2. 實現Init 方法,并且注冊需要的方法。
3. 實現注冊的方法。
4. 實現Dispose方法,如果需要手工為類做一些清除工作,可以添加Dispose方法的實現,但這不是必需的,通常可以不為Dispose方法添加任何代碼。
5. 在Web.config文件中,注冊您編寫的類。
下邊我們來看例子,HttpModule的實現:
首先添加一個類庫,然后在引用里引用System.Web和System.Security這兩個命名空間。然后寫個類,代碼如下:
新聞熱點
疑難解答
圖片精選