在之前的ASP.NET是如何在IIS下工作的這篇文章中介紹了ASP.NET與IIS配合工作的機制,在http請求經過一系列處理后,最后到達ASP.NET管道中,這時,就是Http Modules和HttpHandler出場的時候了。
再來擺出管道工作時序圖來一看:
HttpModule
HttpModule是類似于過濾器的作用,可以沒有,也可以有任意個,每一個都可以訂閱管道事件中的任意個事件,在每個訂閱的事件中可自定義功能實現。
HttpModule是實現IHttpModule接口的類。接口如下:
public interface IHttpModule { // 摘要: // 處置由實現 System.Web.IHttpModule 的模塊使用的資源(內存除外)。 void Dispose(); // // 摘要: // 初始化模塊,并使其為處理請求做好準備。 // // 參數: // context: // 一個 System.Web.Httpapplication,它提供對 ASP.NET 應用程序內所有應用程序對象的公用的方法、屬性和事件的訪問 void Init(HttpApplication context); }
下面實現一個HttpModule,并訂閱管道中的一系列事件,訂閱事件就是在Init方法中綁定EventHandler的過程:
代碼有點長,因為我把每一個事件都訂閱了,這樣一來可以清楚的看出哪些事件執行了,這些事件執行的先后順序是什么。代碼如下:
public class MyModule : IHttpModule { #region IHttpModule Members public void Dispose() { //此處放置清除代碼。 } public void Init(HttpApplication context) { // 下面是如何處理 LogRequest 事件并為其 // 提供自定義日志記錄實現的示例 context.LogRequest += new EventHandler(OnLogRequest); context.BeginRequest += new EventHandler(context_BeginRequest); context.AuthenticateRequest += new EventHandler(context_AuthenticateRequest); context.AcquireRequestState += new EventHandler(context_AcquireRequestState); context.AuthorizeRequest += new EventHandler(context_AuthorizeRequest); context.Disposed += new EventHandler(context_Disposed); context.Error += new EventHandler(context_Error); context.EndRequest += new EventHandler(context_EndRequest); context.MaPRequestHandler += new EventHandler(context_MapRequestHandler); context.PostAcquireRequestState += new EventHandler(context_PostAcquireRequestState); context.PostAuthenticateRequest += new EventHandler(context_PostAuthenticateRequest); context.PostAuthorizeRequest += new EventHandler(context_PostAuthorizeRequest); context.PostLogRequest += new EventHandler(context_PostLogRequest); context.PostReleaseRequestState += new EventHandler(context_PostReleaseRequestState); context.PostRequestHandlerExecute += new EventHandler(context_PostRequestHandlerExecute); context.PostResolveRequestCache += new EventHandler(context_PostResolveRequestCache); context.PostUpdateRequestCache += new EventHandler(context_PostUpdateRequestCache); context.ReleaseRequestState += new EventHandler(context_ReleaseRequestState); context.RequestCompleted += new EventHandler(context_RequestCompleted); context.ResolveRequestCache += new EventHandler(context_ResolveRequestCache); context.UpdateRequestCache += new EventHandler(context_UpdateRequestCache); context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute); context.PreSendRequestContent += new EventHandler(context_PreSendRequestContent); context.PreSendRequestHeaders += new EventHandler(context_PreSendRequestHeaders); context.PostMapRequestHandler += new EventHandler(context_PostMapRequestHandler); } void context_Error(object sender, EventArgs e) { WriteLog("Error"); //HttpContext.Current.Response.Write("Error<br />"); } void context_UpdateRequestCache(object sender, EventArgs e) { WriteLog("UpdateRequestCache"); //HttpContext.Current.Response.Write("UpdateRequestCache<br />"); } void context_ResolveRequestCache(object sender, EventArgs e) { WriteLog("ResolveRequestCache"); // HttpContext.Current.Response.Write("ResolveRequestCache<br />"); } void context_RequestCompleted(object sender, EventArgs e) { WriteLog("RequestCompleted"); // HttpContext.Current.Response.Write("RequestCompleted<br />"); } void context_ReleaseRequestState(object sender, EventArgs e) { WriteLog("ReleaseRequestState"); //HttpContext.Current.Response.Write("ReleaseRequestState<br />"); } void context_PostUpdateRequestCache(object sender, EventArgs e) { WriteLog("PostUpdateRequestCache"); //HttpContext.Current.Response.Write("PostUpdateRequestCache<br />"); } void context_PostResolveRequestCache(object sender, EventArgs e) { WriteLog("PostResolveRequestCache"); //HttpContext.Current.Response.Write("PostResolveRequestCache<br />"); } void context_PostRequestHandlerExecute(object sender, EventArgs e) { WriteLog("PostRequestHandlerExecute"); //HttpContext.Current.Response.Write("PostRequestHandlerExecute<br />"); } void context_PostReleaseRequestState(object sender, EventArgs e) { WriteLog("PostReleaseRequestState"); //HttpContext.Current.Response.Write("PostReleaseRequestState<br />"); } void context_PostLogRequest(object sender, EventArgs e) { WriteLog("PostLogRequest"); //HttpContext.Current.Response.Write("PostLogRequest<br />"); } void context_PostAuthorizeRequest(object sender, EventArgs e) { WriteLog("PostAuthorizeRequest"); //HttpContext.Current.Response.Write("PostAuthorizeRequest<br />"); } void context_PostAuthenticateRequest(object sender, EventArgs e) { WriteLog("PostAuthenticateRequest"); //HttpContext.Current.Response.Write("PostAuthenticateRequest<br />"); } void context_PostAcquireRequestState(object sender, EventArgs e) { WriteLog("PostAcquireRequestState"); //HttpContext.Current.Response.Write("PostAcquireRequestState<br />"); } void context_MapRequestHandler(object sender, EventArgs e) { WriteLog("MapRequestHandler"); //HttpContext.Current.Response.Write("MapRequestHandler<br />"); } void context_Disposed(object sender, EventArgs e) { WriteLog("Disposed"); //HttpContext.Current.Response.Write("Disposed<br />"); } void context_AuthorizeRequest(object sender, EventArgs e) { WriteLog("AuthorizeRequest"); //HttpContext.Current.Response.Write("AuthorizeRequest<br />"); } void context_AcquireRequestState(object sender, EventArgs e) { WriteLog("AcquireRequestState"); //HttpContext.Current.Response.Write("AcquireRequestState<br />"); } void context_PreSendRequestHeaders(object sender, EventArgs e) { WriteLog("PreSendRequestHeaders"); //HttpContext.Current.Response.Write("PreSendRequestHeaders<br />"); } void context_PreSendRequestContent(object sender, EventArgs e) { WriteLog("PreSendRequestContent"); //HttpContext.Current.Response.Write("PreSendRequestContent<br />"); } void context_PreRequestHandlerExecute(object sender, EventArgs e) { WriteLog("PreRequestHandlerExecute"); //HttpContext.Current.Response.Write("PreRequestHandlerExecute<br />"); } void context_EndRequest(object sender, EventArgs e) { WriteLog("EndRequest"); //HttpContext.Current.Response.Write("EndRequest<br />"); } void context_BeginRequest(object sender, EventArgs e) { Wr
新聞熱點
疑難解答