上篇文章我們主要講了HttpApplicatiion管道事件,那麼我麼如何處理這些管道事件呢,以及請求在ASP.NET是如何執行的呢,我們來了解一下IHttpHandler和IHttpModule
引言:
處理HttpApplicatiion事件
HttpApplication提供了基於事件的擴展機制,允許程序員借助於處理管道中的事件進行處理過程擴展。由於HttpApplication對象是ASP.NET基礎架構來創建和維護,那麼如何才能獲得這個對象引用,以便於注冊HttpApplication對象的事件處理,在ASP.NET中提供了兩種方式來 解決這個問題:IHttpModule和global.aspx,這兩種方式的核心都是IHttpModule幾口,下面我們就主要講IHttpModule。
正文:
IHttpModule的用途以及用法
在ASP.NET中,定義在System.Web命名空間下的IHttpModule接口專門用了定義HttpApplication對象的事件處理。
實現IHttpModule接口的類成為HttpModule。IHttpModule接口的定義如下,僅僅包含兩個成員:
public interface IHttpModule { void Dispose() void Init(HttpApplication context) }
其中,Dispose方法用於回收Module所使用的非托管資源,如果沒有的話,直接返回即可。
最重要的是第二個方法Init,可以看到這個方法接受一個HttpApplication類型的參數,在ASP.NET中,每當創建一個HttpApplication對象實例,將遍歷注冊的HttpModule類型,通過反射依次創建 麼個注冊HttpModule類型的一個實例對象,並將這個HttpApplication實例通過Init方法傳遞給各個HttpModule,這樣HttpModule對象就可以在第一時間完成針對HttpApplication對象的事件注冊了。
例如,希望寫一個PostAuthenticateRequest事件的HttpModule,那麼就可以完成以下注冊
pulic class xxx:IHttpModule { void Dispose() void Init(HttpApplication app) { app.PostAuthencateRequest+=new EventHandler(app_PostAuthencateRequest) } }
當然,實現IHttpModule接口只是實現HttpModule的一部分,在ASP.NET中所使用的HttpModule還要在網站配置文件中進行注冊才能真正生效,並在ASP.NET中使用,這一點我們就不在講解了,下面看一下IHttpHandler。
IHttpHandler
在ASP.NET中,請求的真正處理就是在處理程序這個環節,也就是在HttpApplication19個標准事件的PreRequestHandlerExcute和PostRequestHandlerExcute之間,PreRequestHandlerExcute負責同志程序員,處理程序就要開始工作了,PostRequestHandlerExcute事件同志程序員ASP.NET服務器的處理程序已經完成。那麼HttpApplication的作用是什麼呢?我們可以把它看做請求到達處理程序和離開處理程序的一個管道,這個管道提供了統一處理所有請求的機制,使得我們可以在請求被真正處理之前和處理之後進行預處理和處理後的工作。
處理程序負責完成實際的請求處理工作,對於網站開發人員來說,大多數的開發工作是圍繞著處理程序展開的。(其實我們可以看到,我們的頁面類也就是Page實現了IHttphandler接口)實際上,接觸到HttpApplication事件處理的時候並不多,處理程序在不同的網站開發技術中有不同的名字,在ASP.NET中,為HttpHandler。
在ASP.NET中,所有的處理程序類必須實現IHttpHandler接口或者實現IHttpAsyncHandler接口,我們可以很明顯看出區別來,一個是同步接口,一個是異步處理模式的接口。那麼我們通常使用的是同步模式的接口。下面我們簡單介紹一下
這兩個接口都定義在System.Web下,IHttphandler接口的定義如下
public interface IHttpHandler { void ProcessRequest(HttpContext context) bool IsRequest{get;} }
ProcessRequest是這個接口的主要方法,接收一個HttpContext類型的請求上下文對象,通過這個對象,處理程序可以得到關於處理請求所需的信息,通過這個參數的Response屬性可以得到管理回應的對象,可以向客戶端返回服務器的處理結果。
IsRequest屬性表示當這個處理程序對象在使用之後,是否還可以被緩存起來,在以後的請求處理中用。
當然,同樣的是我們也要注冊處理程序,每一種處理處理程序用來處理一類的請求,處理程序與請求之間的匹配關系可以在網站的配置文件中通過配置參數來進行設置。
本欄目