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