最近開發中涉及到一些使用IHttpModule和IHttpHandler,儲備不夠便到MSDN學習了一下。
這兩個介面是怎麼產生的呢,這恐怕要從IIS處理外部請求說起:
IIS本身無法處理動態網頁面,僅支援靜態HTML頁面,為瞭解決此問題引入了ISPAI機制,從字面理解就是一個API,這種機制有兩種實現方式
IHttpModule:這個介面被賦予了ISAPI過濾器功能,通過對HttpApplication對象的一系列事件的處理來對Http處理管道施加影響,這些方法在HttpModule的Init事件中註冊,通常會在webconfig檔案中進行配置,也可以有多個HttpModule,執行順序在webconfig中註冊的順序是一致的,而且每一個都會執行。但是IHttpHandler卻是如果第一個適配後面的就不再重複執行,他的Init方法和Application_Start是不同的,HTTPRuntime維護著一個HttpApplication Pool而他是並發的所以多個使用者訪問可能會多次執行Init,而Application_Start這個方法只在伺服器第一次啟動時執行
IHttpHandler:他是實現了ISAPI擴充功能,可以自訂實現IHttpHandler,然後在IIS伺服器重註冊,進而實現自己喜歡的擴張名,別忘了在config檔案中也註冊
理解這個之後可以在處理HttpRequest之前就進行校正,而不是傳統的揮發到頁面在處理,這樣的提前處理對海量訪問的效率提高有好處
一,IHttpModule
查看這個介面的代碼可以發現,它是由兩個方法組成:
public interface IHttpModule{ void Dispose(); void Init(HttpApplication context); }
看到兩個方法及方法標籤,就明白這個IHttpModule介面有什麼作用了,Init方法中傳入了一個HttpApplication參數,它提供對 ASP.NET 應用程式內所有應用程式物件的公用的方法、屬性和事件的訪問,包括了HttpApplication下的方法、屬性和事件的訪問。那麼具體有那些呢?
包括了所有我們經常會用到的一些對象,Application,Context,Event,Modules,Request,Response,Server,Session,Site,User,BeginRequest,EndRequest等等,其中Context中有個一個方法Context.RewritePath可以用來重寫URL的,也就是說只要你在App_code中添加一個繼承IHttpModule介面的類,並在webconfig中添加此Module後,這個類就可以處理全域的應用程式所有的方法、屬性和事件了。
這裡針對URL重寫做了個小測試
public interface IHttpHandler
{
bool IsReusable { get; }
void ProcessRequest(HttpContext context);
}
IsReusable擷取一個值,該值指示其他請求是否可以使用 System.Web.IHttpHandler 執行個體。
System.Web.HttpContext 對象,它提供對用於為 HTTP 要求提供服務的內部伺服器對象(如 Request、Response、Session 和 Server)的引用。