理解并自定义HttpModule

前言                                  

  继上一篇理解并自定义HttpHandler后,有进行了HttpModule的进一步学习,本篇作为一个小结。

  主要参考:Asp.Net 构架(HttpModule 介绍) - Part.3

目录                                  

1.到底什么是HttpModule?

2.系统内部的HttpModule。

3.配置HttpModule。

4.自定义HttpModule。

5.Global.asax文件与HttpModule。

 

到底什么是HttpModule                          

  Asp.net的事件分为三级:应用程序级、页面级和控件级。而HttpModule是通过在管道模型中对Asp.net的应用程序级事件进行
订阅,当应用程序级事件触发时调用HttpModule中对应的处理方法。也就是说HttpModule是订阅Asp.net应用程序级事件的入口,依附
于HttpApplication对象生命周期的各个事件。

 

系统内部的HttpModule                          

  Asp.net内部很多功能都以HttpModule形式来实行,如Windows、Forms和PassPort认证、Session机制等。下面是部分的内部HttpModule及其作用。

名称 类型 功能
OutputCache System.Web.Caching.OutputCacheModule 页面级输出缓存
Session System.Web.SessionState.SessionStateModule Session状态管理
WindowsAuthentication System.Web.Security.WindowsAuthenticationModule 用集成Windows身份验证进行客户端验证
FormsAuthentication System.Web.Security.FormsAuthenticationModule 用基于Cookie的窗体身份验证进行客户端身份验证
PassportAuthentication System.Web.Security.PassportAuthenticationModule 用MS护照进行客户身份验证
RoleManager System.Web.Security.RoleManagerModule 管理当前用户角色
UrlAuthorization System.Web.Security.UrlAuthorizationModule 判断用户是否被授权访问某一URL
FileAuthorization System.Web.Security.FileAuthorizationModule 判断用户是否被授权访问某一资源
AnonymousIdentification System.Web.Security.AnonymousIdentificationModule 管理Asp.Net应用程序中的匿名访问
Profile System.Web.Profile.ProfileModule 管理用户档案文件的创立 及相关事件
ErrorHandlerModule System.Web.Mobile.ErrorHandlerModule 捕捉异常,格式化错误提示字符,传递给客户端程序

 

配置HttpModule                              

  自定义HttpModule跟自定义HttpHandler相似,都要在web.config文件中进行配置。形式如下:



1 <HttpModules>
2   <add name="MM" type="MyModule,MMAssembly"/>
3 </HttpModules>

1.type:跟HttpHandler中的一样,有两部分组成,第一部分是完整的类名(含命名空间名),第二部分是所在程序集名(不含.dll)。

2.name:HttpModule的名称,可以跟类名无关。通过HttpApplication对象的Modules属性获取
HttpModuleCollection,然后通过name获取对应的HttpModule对象;在Global.asax中通过方法名
ModuleName_EventName订阅HttpModule中的事件,这里为MM_具体的事件名,详细请见下面实例。

3.因为对于每个进入工作进程的请求都会经过各已配置的HttpModule的处理(因为HttpModule是订阅应用程序级事件的),所以配置文件中没有path和verb属性(不管是*.aspx还是*.ashx,请求方式为get还是post都会进行处理)。

注意:HttpModule的配置是无需像HttpHandler那样在IIS上进行配置的。

 

自定义HttpModule                             

  每个HttpModule都继承System.Web.IHttpModule接口,并实现接口的Init(HttpApplication context)和Dispose()方法。如下:

public class MyModule:IHttpModule
{

    public void Init(HttpApplication context)
    {
        context.BeginRequest += new EventHandler(context_BeginRequest);
    }

    void context_BeginRequest(object sender, EventArgs e)
    {
        HttpContext.Current.Response.Write("BeginRequest");
    }

    public void Dispose()
    {
    }
}

Init():这个方法接受一个HttpApplication对象,HttpApplication代表了当
前的应用程序,我们需要在这个方法内订阅
HttpApplication对象暴露给客户端的事件。可见,这个方法仅仅是用来对事件进行订阅,而实际的事件处理程序,需要我们另外写方法。

Dispose():在垃圾回收前释放资源。

整个过程很好理解:

  1. 当站点第一个资源被访问的时候,Asp.Net会创建HttpApplication类的实例,它代表着站点应用程序,同时会创建所有在Web.Config中注册过的Module实例。
  2. 在创建Module实例的时候会调用Module的Init()方法。
  3. 在Init()方法内,对想要作出响应的HttpApplication暴露出的事件进行注册。(仅仅进行方法的简单注册,实际的方法需要另写)。
  4. HttpApplication在其应用程序周期中触发各类事件。
  5. 触发事件的时候调用Module在其Init()方法中注册过的方法。

关于委托可参考:委托与事件

 

Global.asax文件与 HttpModule                    

在asp.net中,Glabal不仅可以注册应用程序和Session事件,还可以注册Http Module暴露出的事件;不仅可以注册系统Module的事件,也可以注册我们自己义的Module暴露出的事件。在具体介绍之前,这里需要首先注意两点:

  1. 在每处理一个Http请求时,应用程序事件都会触发一遍,但是Application_Start和 Application_End 例外,它仅在第一个资源文件被访问时被触发。
  2. Http Module无法注册和响应Session事件,对于Session_Start 和 Session_End,只能通过Glabal.asax来处理。

继续上面的例子:

MyModule.cs文件

public class MyModule:IHttpModule
{
    public event EventHandler ExposedEvent;//HttpModule事件,供Global.asax来订阅

    public void Init(HttpApplication context)
    {
        context.BeginRequest += new EventHandler(context_BeginRequest);//订阅HttpApplication的事件
    }

    void context_BeginRequest(object sender, EventArgs e)
    {
        HttpContext.Current.Response.Write("BeginRequest");
        OnExposedEvent(new EventArgs());//触发HttpModule自定义事件
    }

    protected void OnExposedEvent(EventArgs e)
    {
        if (ExposedEvent != null)
        {
            ExposedEvent(this, e);
        }
    }

    public void Dispose()
    {
    }
}

Global.asax文件

1 void MyModule_ExposedEvent(object sender, EventArgs e)
2 {
3     Response.Write("xixi");
4 }

上面的MyModule_ExposedEvent方法就会自动订阅了MyModule中的ExposedEvent事件。具体实现机制有待研究!

时间: 2024-12-31 02:38:40

理解并自定义HttpModule的相关文章

自定义HttpModule运行出现错误

问题描述 我是按照MSDN上自定义HttpModule的例子写的(HelloWorldModule),但是运行的时候出现了错误,不知道是哪里出错了1.我的解决方案我的HttpModule类放在App_Code文件夹下,名字:HelloWorldModule.cs.2.Init方法里面订阅类HttpApplication的BeginRequest和EndRequest事件3.具体的方法,想客户端发送一段文字4.新建了一个aspx页面,运行的时候出现错误:5.我的配置文件:6.ErrorTrace,

深入理解jquery自定义动画animate()_jquery

在以前很长一段时间里,网页上的各种特效还需要采用flash 在进行.但最近几年里,我们已经很少看到这种情况了,绝大部分已经使用JavaScript 动画效果来取代flash.这里 说的取代是网页特效部分,而不是动画.网页特效比如:渐变菜单.渐进显示.图片轮播等:而动画比如:故事情节广告.MV 等等.  如果复制当前代码进行在本地测试的时候,请注意把不需要(其他功能展示)的代码注释掉. <!DOCTYPE html> <html xmlns="http://www.w3.org/

深入理解Android 自定义attr Style styleable以及其应用

相信每一位从事Android开发的猿都遇到过需要自己去自定义View的需求,如果想通过xml指定一些我们自己需要的参数,就需要自己声明一个styleable,并在里面自己定义一些attr属性,这个过程相信大家都比较了解.当然,属性其实也不一定需要和View配合使用,比如我想通过一个Theme中的style对一个库进行一些简单参数的配置,这应该怎么做呢?我今天在封装一个库时在这个地方浪费了较多时间,最后没办法,到处搜搜资料,记录在这里吧,相信对大家都有帮助. attr和styleable的关系 首

理解并自定义HttpHandler

前言 之前从网上找了几篇讲解如何自定义HttpHandler的文章,依葫芦画瓢却一直没成功过.经过上一篇<asp.net管道模型(管线模型)之一发不可收拾>的总结,对管道模型和请求/响应过程有进一步的了解后,再结合Asp.Net 构架(Http Handler 介绍) - Part.2后终于成功定义自己的HttpHandler和HttpHandlerFactory了^_^. 本文有些地方会跟<asp.net管道模型(管线模型)之一发不可收拾>有些重叠,但角度会有所不同,两篇文章相互

Asp.net管道模型(管线模型)之一发不可收拾

前言   为什么我会起这样的一个标题,其实我原本只想了解asp.net的管道模型而已,但在查看资料的时候遇到不明白的地方又横向地查阅了其他相关的资料,而收获比当初预想的大了很多.   有本篇作基础,下面两篇就更好理解了:   理解并自定义HttpHandler   理解并自定义HttpModule 目录   一般不写目录,感觉这次要写的东西有些多就写一个清晰一下吧.   1.Asp.net管道模型:   2.进程的子进程与进程的线程:   3.应用程序域(AppDomain):   4.IIS5

关于HttpHandler与HttpModule的理解和应用方法_实用技巧

神秘的HttpHandler与HttpModule        大学时候我是从拖控件开始学习asp.net的,对.net的很多类库对象都不是很了解.所以看到大家写一些个性的asp.net名词,就感觉asp.net总有一层神秘的面纱笼罩着,让我琢磨不透,相信园子里面也有很多和我经历差不多的.net攻城师.在以前看HttpHandler与HttpModule都是神秘莫测的.哈哈,今天我为大家展示下我对他的理解,以及应用.       也许你不懂HttpHandler与HttpModule(大侠Re

HttpHandler HttpModule入门篇

HttpHandler HttpModule入门篇 ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHandler,HttpHandler处理完之后,仍经过Pipeline中各个HttpModule的处理,最后将HTML发送到客户端浏览器中. 生命周期中涉及到几个非常重要的对象:HttpHandler,HttpModule,IHttpHandlerFactory,他们的执行(顺序)大致的执行过程是这样的:

HttpHandler HttpModule入门篇_实用技巧

生命周期中涉及到几个非常重要的对象:HttpHandler,HttpModule,IHttpHandlerFactory,他们的执行(顺序)大致的执行过程是这样的:client端发送页面请求,被IIS的某个进程截获,它根据申请的页 面后缀(.aspx)不同,调用不同的页面处理程序(.asp->asp.dll; .aspx->ISAPI.dll).而页面处理程序在处理过程中,则要经历HttpModule,HttpHandler的处理:前者HttpModule用于页面处理前和处理后的一些事件的处理

Android 自定义ViewGroup

前面几节,我们重点讨论了自定义View的三板斧,这节我们来讨论自定义ViewGroup,为什么要自定义ViewGroup,其实就是为了更好的管理View. 自定义ViewGroup无非那么几步: Ⅰ.重写OnMeasure()方法,测试子控件的大小. Ⅱ.重写onLayout()方法,计算子控件的布局. Ⅲ.在onDraw()方法中,绘制子控件,可有可无. Ⅳ.监听onTouch事件,响应屏幕触摸事件. 相应思维导图如下所示: 连篇累牍的说了这么多,我们通过一个小案例来理解这个自定义ViewGr