ASP.NET HttpModule的使用说明

摘要:HttpModule可以用于全局身份验证、url重写、异常处理等场景。本文以身份验证为场景,介绍HttpModule的使用。



ASP.NET请求处理过程是基于管道模型的,这个管道模型是由多个HttpModule和HttpHandler组成,ASP.NET把http请求依次传递给管道中各个HttpModule,最终被HttpHandler处理,处理完成后,再次经过管道中的HTTP模块,把结果返回给客户端。我们可以在每个HttpModule中都可以干预请求的处理过程。


注意:在http请求的处理过程中,只能调用一个HttpHandler,但可以调用多个HttpModule。 
当请求到达HttpModule的时候,系统还没有对这个请求真正处理,但是我们可以在这个请求传递到处理中心(HttpHandler)之前附加一些其它信息,或者截获的这个请求并作一些额外的工作,也或者终止请求等。在HttpHandler处理完请求之后,我们可以再在相应的HttpModule中把请求处理的结果进行再次加工返回客户端。


1 HttpModule工作原理

负责监听HttpRequest,同时对HttpRequest增添或者过滤掉一部分内容。也就是说,当一个HTTP请求到 达HttpModule时,整个ASP.NET Framework系统还并没有对这个HTTP请求做任何处理,也就是说此时对于HTTP请求来讲,HttpModule是一个HTTP请求的“必经之 路”,所以可以在这个HTTP请求传递到真正的请求处理中心(HttpHandler)之前附加一些需要的信息在这个HTTP请求信息之上,或者针对截获 的这个HTTP请求信息作一些额外的工作,或者在某些情况下干脆终止满足一些条件的HTTP请求,从而可以起到一个Filter过滤器的作用。 

HttpModule实现了接口IHttpModule,我们可以自定义实现该接口的类,从而取代HttpModule。


1.1 HttpModule事件

BeginRequest 指示请求处理开始
AuthenticateRequest 封装请求身份验证过程
AuthorizeRequest 封装检查是否能利用以前缓存的输出页面处理请求的过程
ResolveRequestCache 从缓存中得到相应时候触发
AcquireRequestState 加载初始化Session时候触发
PreRequestHandlerExecute 在Http请求进入HttpHandler之前触发
PostRequestHandlerExecute 在Http请求进入HttpHandler之后触发
ReleaseRequestState 存储Session状态时候触发
UpdateRequestCache 更新缓存信息时触发
EndRequest 在Http请求处理完成的时候触发
PreSendRequestHenaders 在向客户端发送Header之前触发
PreSendRequestConternt 在向客户端发送内容之前触发

1.2 HttpModule生命周期



2 项目范例代码 

2.1 实现IHttpModule接口

public class CustomHttpModule : IHttpModule
    {
        //单点登录URL
        public  string LoginUrl = "http://www.sample.com/Login/Index?ReturnUrl=http://www.sample.com/Book/Search";

        public void Dispose()
        {
            throw new NotImplementedException();
        }

        public void Init(HttpApplication context)
        {
            context.BeginRequest += Context_BeginRequest; //bind BeginRequest event, handle event 
        }

        private void Context_BeginRequest(object sender, EventArgs e)
        {
            HttpApplication HA = (HttpApplication)sender; //获得发生该事件的对象

            var rlLoginCookie = HA.Context.Request.Cookies["LoginNameInCookie"];

            //如果未授权,则跳转到登陆页面
            if (rlLoginCookie == null)
            {
                HA.Response.Redirect(LoginUrl);
            }
        }
    }

2.2 注册HttpModule

IIS7.0以前的版本中,注册代码放在web.config文件下,configuration->system.web以下

注册代码为:

<httpModules>
       <add name="ModuleClassName" type="NameSpace. ModuleClassName, NameSpace"/>
</httpModules>


IIS7及更新版本中,配置信息需要在configuration->system.webServer以下

注册代码为

    <modules>
        <add name="ModuleClassName" type="Namespace.ModuleClassName"/>
     </modules>




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值