HttpApplication觸發事件來通知你的程序有事發生,以此來負責請求流轉。這作為HttpApplication.Init()函數的一部分發生,連續設置並啟動一系列事件。
HttpApplication觸發事件來通知你的程序有事發生,以此來負責請求流轉。這作為HttpApplication.Init()函數的一部分發生(用Reflector查看System.Web.HttpApplication.InitInternal()方法和HttpApplication.ResumeSteps()方法來了解更多詳情),連續設置並啟動一系列事件,包括執行所有的處理器(handler)。這些事件處理器映射到global.asax中自動生成的哪些事件中,同時它們也映射到所有附加的HttpModule(它們本質上是HttpApplication對外發布的額外的事件接收器(sink))。
HttpModule和HttpHandler兩者都是根據Web.config中對應的配置被動態載入並附加到事件處理鏈中。HttpModule實際上是事件處理器,附加到特殊的HttpApplication事件上,然而HttpHandler是用來處理”應用級請求處理”的終點。
HttpModule和HttpHandler兩者都是在HttpApplication.Init()函數調用的一部分中被載入並附加到調用鏈上。圖6顯示了不同的事件,它們是何時發生的以及它們影響管道的哪一部分。
圖6:事件在ASP.net http管道中流轉的過程
HttpApplication對象的事件驅動請求在管道中流轉.HttpModule可以攔截這些事件並覆蓋或者擴展現有的功能。
HttpContext, HttpModules 和 HttpHandlers
httpApplication它本身對發送給應用程序的數據一無所知-它只是一個通過事件來通訊的消息對象。它觸發事件並通過HttpContext對象來向被調用函數傳遞消息。實際的當前請求的狀態數據由前面提到的HttpContext對象維護。它提供了所有請求專有的數據並從進入管道開始到結束一直跟隨請求。圖7顯示了ASP.NET管道中的流程.注意上下文對象(即HttpContext),這個從請求開始到結束一直都是你“朋友”的對象,可以在一個事件處理函數中保存信息並在以後的事件處理函數中取出。
一旦管道被啟動,HttpApplication開始象圖六那樣一個個的觸發事件。每個事件處理器被觸發,如果事件被掛接,這些處理器將執行它們自己的任務。這個處理的主要任務是最終調用掛接到此特定請求的HttpHandler。處理器(handler)是ASP.NET請求的核心處理機制,通常也是所有應用程序級別的代碼被執行的地方。記住ASP.NET頁面和Web服務框架都是作為HttpHandler實現,這裡也是處理請求的的核心之處。模塊(module)趨向於成為一個傳遞給處理器(handler)的上下文的預處理或後處理器。ASP.NET中典型的默認處理器包括預處理的認證,緩存以及後處理中各種不同的編碼機制。
有很多關於HttpHandler和HttpModule的可用信息,所以為了保持這篇文章在一個合理的長度,我將提供一個關於處理器的概要介紹。