zoukankan      html  css  js  c++  java
  • HTTPModule生命周期与页面执行模型

    HttpModule是如何工作的
    当一个HTTP请求到达HttpModule时,整个ASP.NET Framework系统还并没有对这个HTTP请求做任何处理,也就是说此时对于HTTP请求来讲,HttpModule是一个HTTP请求的“必经之路”,所以可以在这个HTTP请求传递到真正的请求处理中心(HttpHandler)之前附加一些需要的信息在这个HTTP请求信息之上,或者针对截获的这个HTTP请求信息作一些额外的工作,或者在某些情况下干脆终止满足一些条件的HTTP请求,从而可以起到一个Filter过滤器的作用。
     
    示例1:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Web;
     
    namespace MyHttpModule
    {
         ///<summary>
         ///说明:用来实现自己的HttpModule类。
         ///作者:文野
         ///联系:stwyhm@cnblogs.com
         ///</summary>
         public class MyFirstHttpModule : IHttpModule
         {
             private void Application_BeginRequest(object sender, EventArgs e)
             {
                  HttpApplication application = (HttpApplication)sender;
                  HttpContext context = application.Context;
                  HttpRequest request = application.Request;
                  HttpResponse response = application.Response;
     
                  response.Write("我来自自定义HttpModule中的BeginRequest<br />");
             }
     
             private void Application_EndRequest(object sender, EventArgs e)
             {
                  HttpApplication application = (HttpApplication)sender;
                  HttpContext context = application.Context;
                  HttpRequest request = application.Request;
                  HttpResponse response = application.Response;
     
                  response.Write("我来自自定义HttpModule中的EndRequest<br />");
             }
     
             #region IHttpModule 成员
     
             public void Dispose()
             {}
     
             public void Init(HttpApplication application)
             {
                  application.BeginRequest += new EventHandler(Application_BeginRequest);
                  application.EndRequest += new EventHandler(Application_EndRequest);
             }
     
             #endregion
         }
    }
    在Web.config进行如下配置
    <addname="MyFirstHttpModule"type="MyHttpModule.MyFirstHttpModule,MyHttpModule"/>


     

    深入了解HttpModule
    一个HTTP请求在HttpModule容器的传递过程中,会在某一时刻(ResolveRequestCache事件)将这个HTTP请求传递给HttpHandler容器。在这个事件之后,HttpModule容器会建立一个HttpHandler的入口实例,但是此时并没有将HTTP请求控制权交出,而是继续触发AcquireRequestState事件以及PreRequestHandlerExcute事件。在PreRequestHandlerExcute事件之后,HttpModule窗口就会将控制权暂时交给HttpHandler容器,以便进行真正的HTTP请求处理工作。
    而在HttpHandler容器内部会执行ProcessRequest方法来处理HTTP请求。在容器HttpHandler处理完毕整个HTTP请求之后,会将控制权交还给HttpModule,HttpModule则会继续对处理完毕的HTTP请求信息流进行层层的转交动作,直到返回到客户端为止。


    图1:HttpModule生命周期示意图
     
    示例2:验证HttpModule生命周期
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Web;
     
    namespace MyHttpModule
    {
        public class ValidaterHttpModule : IHttpModule
        {
            #region IHttpModule 成员
     
            public void Dispose()
            {}
     
            public void Init(HttpApplication application)
            {
                application.BeginRequest += new EventHandler(application_BeginRequest);
                application.EndRequest += new EventHandler(application_EndRequest);
                application.PreRequestHandlerExecute += new EventHandler(application_PreRequestHandlerExecute);
                application.PostRequestHandlerExecute += new EventHandler(application_PostRequestHandlerExecute);
                application.ReleaseRequestState += new EventHandler(application_ReleaseRequestState);
                application.AcquireRequestState += new EventHandler(application_AcquireRequestState);
                application.AuthenticateRequest += new EventHandler(application_AuthenticateRequest);
                application.AuthorizeRequest += new EventHandler(application_AuthorizeRequest);
                application.ResolveRequestCache += new EventHandler(application_ResolveRequestCache);
                application.PreSendRequestHeaders += new EventHandler(application_PreSendRequestHeaders);
                application.PreSendRequestContent += new EventHandler(application_PreSendRequestContent);
            }
     
            void application_PreSendRequestContent(object sender, EventArgs e)
            {
                HttpApplication application = (HttpApplication)sender;
               application.Context.Response.Write("application_PreSendRequestContent<br/>");
            }
     
            void application_PreSendRequestHeaders(object sender, EventArgs e)
            {
                HttpApplication application = (HttpApplication)sender;
                application.Context.Response.Write("application_PreSendRequestHeaders<br/>");
            }
     
            void application_ResolveRequestCache(object sender, EventArgs e)
            {
                HttpApplication application = (HttpApplication)sender;
                application.Context.Response.Write("application_ResolveRequestCache<br/>");
            }
     
            void application_AuthorizeRequest(object sender, EventArgs e)
            {
                HttpApplication application = (HttpApplication)sender;
                application.Context.Response.Write("application_AuthorizeRequest<br/>");
            }
     
            void application_AuthenticateRequest(object sender, EventArgs e)
            {
                HttpApplication application = (HttpApplication)sender;
                application.Context.Response.Write("application_AuthenticateRequest<br/>");
            }
     
            void application_AcquireRequestState(object sender, EventArgs e)
            {
                HttpApplication application = (HttpApplication)sender;
                application.Context.Response.Write("application_AcquireRequestState<br/>");
            }
     
            void application_ReleaseRequestState(object sender, EventArgs e)
            {
                HttpApplication application = (HttpApplication)sender;
                application.Context.Response.Write("application_ReleaseRequestState<br/>");
            }
     
            void application_PostRequestHandlerExecute(object sender, EventArgs e)
            {
                HttpApplication application = (HttpApplication)sender;
                application.Context.Response.Write("application_PostRequestHandlerExecute<br/>");
            }
     
            void application_PreRequestHandlerExecute(object sender, EventArgs e)
            {
                HttpApplication application = (HttpApplication)sender;
                application.Context.Response.Write("application_PreRequestHandlerExecute<br/>");
            }
     
            void application_EndRequest(object sender, EventArgs e)
            {
                HttpApplication application = (HttpApplication)sender;
                application.Context.Response.Write("application_EndRequest<br/>");
            }
     
            void application_BeginRequest(object sender, EventArgs e)
            {
                HttpApplication application = (HttpApplication)sender;
                application.Context.Response.Write("application_BeginRequest<br/>");
            }
     
           
     
            #endregion
        }
    }

     
    多个自定义的Http Module的运作
    从运行结果可以看到,在web.config文件中引入自定义HttpModule的顺序就决定了多个自定义HttpModule在处理一个HTTP请求的接管顺序。注:系统默认那几个HttpModule是最先衩ASP.NET Framework所加载上去的。
    示例3:(代码类同示例2)

    在HttpModule中终止此次的HTTP请求
    可以利用HttpModule通过调用HttpApplication.CompleteRequest()方法实现当满足某一个条件时终止此次的HTTP请求。
    需要注意的是,即使调用了HttpApplication.CompleteRequest()方法终止了一个HTTP请求,ASP.NET Framework仍然会触发HttpApplication后面的这3个事件:EndRequest事件、PreSendRequestHeaders事件、PreSendRequestContent事件。
    如果存在多个自定义的HttpModule的话,当Module1终止了一个HTTP请求,这个HTTP请求将不会再触发Module2中相应的事件了,但Module2的最后三个事件仍会被触发。
    示例4:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Web;
     
    namespace MyHttpModule
    {
        public class CompleteRequestHttpModule : IHttpModule
        {
            #region IHttpModule 成员
     
            public void Dispose()
            {}
     
            public void Init(HttpApplication application)
            {
                application.BeginRequest += new EventHandler(Application_BeginRequest);
            }
     
            void Application_BeginRequest(object sender, EventArgs e)
            {
                HttpApplication application = (HttpApplication)sender;
                application.CompleteRequest();
                application.Context.Response.Write("请求被终止。");
            }
     
            #endregion
        }
    }
     
     
    注意: 当存在多个Module时他们的执行顺序是与你的配置顺充有关, 配置在前的先执行. 当多个Module间存在关联关系时需要注意的.
     
    代码:http://download1.csdn.net/down3/20070527/27174300529.rar

    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1627364
     


    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1670899

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Atwind/archive/2008/01/08/2029999.aspx

  • 相关阅读:
    hdu 5387 Clock (模拟)
    CodeForces 300B Coach (并查集)
    hdu 3342 Legal or Not(拓扑排序)
    hdu 3853 LOOPS(概率DP)
    hdu 3076 ssworld VS DDD(概率dp)
    csu 1120 病毒(LICS 最长公共上升子序列)
    csu 1110 RMQ with Shifts (线段树单点更新)
    poj 1458 Common Subsequence(最大公共子序列)
    poj 2456 Aggressive cows (二分)
    HDU 1869 六度分离(floyd)
  • 原文地址:https://www.cnblogs.com/skyshenwei/p/1606798.html
Copyright © 2011-2022 走看看