认识HttpModule

这篇讲的比较清楚http://www.cnblogs.com/wxh19860528/archive/2012/07/09/2582825.html

下面是自己的整理

管道的处理顺序如下
            BeginRequest //在 ASP.NET 响应请求时作为 HTTP 执行管线链中的第一个事件发生
            AuthenticateRequest//当安全模块已建立用户标识时发生
            AuthorizeRequest//当安全模块已验证用户授权时发生
            ResolveRequestCache//在 ASP.NET 完成授权事件以使缓存模块从缓存中为请求提供服务后发生,从而绕过事件处理程序(例如某个页或 XML Web services)的执行
            AcquireRequestState//当 ASP.NET 获取与当前请求关联的当前状态(如会话状态)时发生。
            PreRequestHandlerExecute//恰好在 ASP.NET 开始执行事件处理程序(例如,某页或某个 XML Web services)前发生。
            PostRequestHandlerExecute//在 ASP.NET 事件处理程序(例如,某页或某个 XML Web service)执行完毕时发生。
            ReleaseRequestState//在 ASP.NET 执行完所有请求事件处理程序后发生。该事件将使状态模块保存当前状态数据。
            UpdateRequestCache//当 ASP.NET 执行完事件处理程序以使缓存模块存储将用于从缓存为后续请求提供服务的响应时发生。
            EndRequest//在 ASP.NET 响应请求时作为 HTTP 执行管线链中的最后一个事件发

实现管道拦截需要继承IHttpModule接口,该接口在System.Web里

需要实现接口的两个方法

// 摘要:
        //     处置由实现 System.Web.IHttpModule 的模块使用的资源(内存除外)。
        void Dispose();
        //
        // 摘要:
        //     初始化模块,并使其为处理请求做好准备。
        //
        // 参数:
        //   context:
        //     一个 System.Web.HttpApplication,它提供对 ASP.NET 应用程序内所有应用程序对象的公用的方法、属性和事件的访问
        void Init(HttpApplication context);


 

目前我所了解的运用就2个,分别是BeginRequestEndRequest

先说EndRequest,进入每个页面有什么弹窗广告呀,页面的脚注啊,如果每个页面都写一遍,那么管理起来非常麻烦

再注册EndRequest

public void Init(HttpApplication context)
        {
            context.BeginRequest+=new EventHandler(context_BeginRequest);
            context.EndRequest+=new EventHandler(context_EndRequest);
        }
private void context_EndRequest(object sender, EventArgs e)
        {
            HttpApplication application = (HttpApplication)sender;
            //application.Response.Write("<----------我是每个页面都要生成的文字----------->");
            application.Response.Write("<script>alert('haha')</script>");
        }

最关键的是需要在web.config里加入这个模块

<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpModules>
      <add name="HttpModule" type="HttpModule.mytest"/>
    </httpModules>
  </system.web>
</configuration>

这里需要注意name和type的值,name的值填程序集名称,type填命名空间+类名,然后运行,就会发现每个页面都会弹窗...当然可以限制httpmodule拦截哪些页面,如下

<appSettings>
    <add key="mytest" value="test1.aspx"/>
    <add key="mytest2" value="test2.aspx"/>
  </appSettings>

在Init初始化时,得到web.config里需要拦截的页面

context.EndRequest+=new EventHandler(context_EndRequest);
stophtml=ConfigurationManager.AppSettings["mytest"].ToLower();

然后再BeginRequest中对比当前请求的页面和需要拦截的页面是否一致

private void context_BeginRequest(object sender, EventArgs e)
        {
            HttpApplication application = (HttpApplication)sender;
            var rawUrl = application.Request.RawUrl.ToLower();
            if (rawUrl.Contains(stophtml))
            {
                application.Response.Write("<------------这是我拦截的页面------------>");
            }

        }

运行,看,需要拦截的页面才会出现那段话

今天就整理到这儿

原文地址:https://www.cnblogs.com/HelloMyWorld/p/2868978.html