您的位置:知识库 » .NET技术

HttpModule的认识与深入理解

作者: FengLang  来源: 博客园  发布时间: 2009-10-22 10:26  阅读: 2516 次  推荐: 1   原文链接   [收藏]  

  HttpModule是向实现类提供模块初始化和处置事件。当一个HTTP请求到达HttpModule时,整个ASP.NET Framework系统还并没有对这个HTTP请求做任何处理,也就是说此时对于HTTP请求来讲,HttpModule是一个HTTP请求的“必经之路”,所以可以在这个HTTP请求传递到真正的请求处理中心(HttpHandler)之前附加一些需要的信息在这个HTTP请求信息之上,或者针对截获的这个HTTP请求信息作一些额外的工作,或者在某些情况下干脆终止满足一些条件的HTTP请求,从而可以起到一个Filter过滤器的作用。

  首先你要实现IHttpModule接口这个接口只有两个方法,一个是Init方法一个Dispose方法.

Code

 

  一个HTTP请求在HttpModule容器的传递过程中,会在某一时刻(ResolveRequestCache事件)将这个HTTP请求传递给HttpHandler容器。在这个事件之后,HttpModule容器会建立一个HttpHandler的入口实例,但是此时并没有将HTTP请求控制权交出,而是继续触发AcquireRequestState事件以及PreRequestHandlerExcute事件。在PreRequestHandlerExcute事件之后,HttpModule窗口就会将控制权暂时交给HttpHandler容器,以便进行真正的HTTP请求处理工作。

  而在HttpHandler容器内部会执行ProcessRequest方法来处理HTTP请求。在容器HttpHandler处理完毕整个HTTP请求之后,会将控制权交还给HttpModule,HttpModule则会继续对处理完毕的HTTP请求信息流进行层层的转交动作,直到返回到客户端为止。

  HttpModule过程在下面的事件:
    1.BeginRequest    指示请求处理开始。
    2.AuthenticateRequest PostAuthenticateRequest    封装请求身份验证过程。
    3.AuthorizeRequest   PostAuthorizeRequest    封装请求授权过程。 
    4.ResolveRequestCache PostResolveRequestCache    封装检查是否能利用以前缓存的输出页面处理请求的过程。
    5.PostMapRequestHandler    指示已发现用于处理请求的 HTTP 处理程序。
    6.AcquireRequestState    PostAcquireRequestState    封装对请求会话状态的检索。
    7.PostRequestHandlerExecute    指示用于处理请求的 HTTP 处理程序已执行。
    8.ReleaseRequestState   PostReleaseRequestState    封装对请求会话状态的发布。
    9.UpdateRequestCache    PostUpdateRequestCache    封装检查是否应对请求的资源的输出进行缓存以备今后重复使用的过程。
    10.EndRequest    指示请求处理结束。

  可以利用HttpModule通过调用HttpApplication.CompleteRequest()方法实现当满足某一个条件时终止此次的HTTP请求。需要注意的是,即使调用了HttpApplication.CompleteRequest()方法终止了一个HTTP请求,ASP.NET Framework仍然会触发HttpApplication后面的这3个事件:EndRequest事件、PreSendRequestHeaders事件、PreSendRequestContent事件。

  如果存在多个自定义的HttpModule的话,当Module1终止了一个HTTP请求,这个HTTP请求将不会再触发Module2中相应的事件了,但Module2的最后三个事件仍会被触发。

Code


HttpModule示例:

 过滤http请求

Code

在web.confg中添加httpModules节点注册事件

判断浏览器的版本 

Code

注册web.config事件

实现URL重写

Code

 注册web.config事件

-------------------------------------------------完成------------------------------------------------

从上面的例子看出,其实是一个好简单的实现方法,就是在init中注册处理过程事件,把代码写完后,在web.congif中HttpModules注册就完成了.

开发程序千变万变, 通过这一方法可以编写出好多合适自己用的功能,这需要大家去实践了. 收集与整理,且当成长的回忆.

1
0

.NET技术热门文章

    .NET技术最新文章

      最新新闻

        热门新闻