在開發基於Microsoft IIS的應用時,開發者除了可以編寫ASP程序外,還可以使用Visual C++等開發工具,開發ISAPI應用,以獲取更為強大的功能。可以編寫兩種ISAPI擴展:一種是ISAPI Server Extention,另一種是ISAPI Filter,但是,ISAPI擴展應用的編寫通常對開發者有比較高的要求,開發和部署的難度比較大。 在開發ASP.Net應用時,我們仍然可以編寫ISAPI應用,以擴充IIS的功能,但是,ASP.Net為我們提供了另外一種選擇——使用HTTP Handler 和HTTP Module。這是通過使用IHttpHandler 和 IHttpModule接口來實現的。HTTP Handler提供了類似於ISAPI Server Extention的功能,而HttpModule實現了類似於ISAPI Filter的功能,並且,比ISAPI,在開發和部署上都要簡單的多。 應用HttpHandler和HttpModule,使應用程序可以與IIS Web服務器的低級別請求和響應服務交互。本文首先介紹HttpHandler和HttpModule的概念和基本使用方法,並介紹了一個應用HttpModule實現權限系統的案例。
HTTP 處理管道的基本模型
要對HttpModule和IHttpHandler進行研究,必須先對ASP.Net的處理管道有一個了解。 在ASP.Net應用程序中,系統使用一組相關的類,通過一定的順序來處理客戶端的請求(Request),ASP.NET應用程序的處理模式可稱之為HTTP處理管道。HttpModule和IhttpHandler就是這個處理管道上的兩個處理環節。 HTTP處理管道中的類在System.Web名稱空間中定義,主要有以下類型: · HttpWorkerRequest 抽象類定義了ASP.Net頁面處理請求的基本方法; · HttpRuntime 提供了處理應用的一組服務; · HttpContext 保存了處理一次請求的所有相關上下文信息; · HttpApplicationFactory 提供相關目錄的應用程序; · HttpApplication 定義了所有ASP.Net應用程序的通用的方法、屬性和事件。這個類也是在用戶在global.asax文件中定義的應用的基類; · Modules 處理請求前和響應後的事件; · HandlerFactorIEs 提供應用程序中的Handlers; · Handlers 處理請求和響應。 HTTP處理管道的模型如下:
圖1:HTTP 處理管道
在Windows平台上,HTTP Pipline需要IIS的支持。為了運行ASP.Net應用,IIS需要以下兩個文件:ASPNET_ISAPI.DLL和ASPNET_WP.EXE · ASPNET_ISAPI.DLL是一個ISAPI Extention他將發向IIS的請轉交ASPNET_WP.EXE處理 · ASPNET_WP.EXE使用HttpRuntime對請求進行具體處理 處理的過程可以用圖表示如下:
圖2:IIS上的HTTP處理管道
HttpHandler的實現
HttpHandler實現了類似於ISAPI Extention的功能,他處理請求(Request)的信息和發送響應(Response)。HttpHandler功能的實現通過實現IHttpHandler接口來達到。實際上,我們在編寫ASP.Net頁面時,ASP.Net頁面所繼承的基類——System.Web.UI.Page——也實現了HttpHandler接口,也是一個HttpHandler,看一下它的定義就知道了(C#):
public class Page : TemplateControl, IhttpHandler
接口IHttpHandler的定義如下:
interface IHttpHandler
{
void ProcessRequest(HttpContext ctx);
bool IsReuseable { get; }
}
接口中ProcessRequest是添加自己的代碼,進行相應處理的地方。IsReuseable屬性指明該HttpHandler的實現類是否需要緩存。