闷蛋

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

  最近几天开始学习.NET运行的相关知识,其中涉及到 IHttpModule 与 IHttpHandler 两个部份,<br/>

  也是我们每一个。NET程序中负责处理我们相应代码的两大部份!<br/>

  在这里说说我对这两个部份的入门级认识,有什么错误之处希望大家可以指正指正!<br/>

  首先是IHttpModule 接口,从MSDN中获得的代码如下:

 
 
代码
[AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal), AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)]  
public interface IHttpModule{   
//释放资源   
  void Dispose();
  
void Init(HttpApplication context); //初始化模块,并使其为处理请求做好准备   
}

 

利用IHttpModule我们可以一些需要的功能:
例如:1:预处理 (验证、修改、过虑..)2:URL重写 3:访问日志 4:流量统计等等
第一个方法我相信大家也大概可以知道有什么作用了吧?
现在我们看下第二个方法:
在此方法中初始化了我们很多平时需要用到的数据:SERVER、REQUEST、REPONSE、Application、SESSION等等<br/>
此方法里也按照以下执行顺序由GLOBAL.ASPX文件中定义的模块与用户代码处理事件(.NET 2.0版本)
  • BeginRequest

  • AuthenticateRequest

  • PostAuthenticateRequest

  • AuthorizeRequest

  • PostAuthorizeRequest

  • ResolveRequestCache

  • PostResolveRequestCache

    PostResolveRequestCache 事件之后、PostMapRequestHandler 事件之前创建一个事件处理程序<br/>(对应于请求 URL 的页)。

  • PostMapRequestHandler

  • AcquireRequestState

  • PostAcquireRequestState

  • PreRequestHandlerExecute

    执行事件处理程序。

  • PostRequestHandlerExecute

  • ReleaseRequestState

  • PostReleaseRequestState

    PostReleaseRequestState 事件之后,响应筛选器(如果有)将对输出进行筛选。

  • UpdateRequestCache

  • PostUpdateRequestCache

  • EndRequest

  • 以下是一个登录验证的例子,希望有助于大家去理解:

     

    代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Web;


    namespace TestModule
    {
    public class LoginFilter : IHttpModule
    {
    s


    public void Init(HttpApplication context)
    {
    //以下四个事件中可以访问SESSION。
    //context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
    //context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
    //context.PostAcquireRequestState += new EventHandler(context_PostAcquireRequestState);
    context.PostRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
    }

    public void context_PreRequestHandlerExecute(object sender, EventArgs e)
    {
    HttpApplication hApp
    = (HttpApplication)sender;
    string URL = hApp.Context.Request.Url.ToString();
    int la = URL.ToLower().ToString().IndexOf("login.aspx");
    if (la == -1)
    {
    if (hApp.Context.Session["userId"] == null)
    {
    hApp.Context.Response.Write(
    "<script language='javascript'>alert('您未登陆或登陆已超时,请重新登陆!');</script>");
    hApp.Context.Response.Redirect(
    "../Login.aspx?source=" + path);
    }
    }
    }


    }
    }

     

    1:在需要应用的项目中增加TestModule.dll引用;

    2:在项目中的Web.Config添加以下代码:

     

    <httpModules>
    <add name="LoginFilter" type="TestModule.LoginFilter,TestModule"/>
    </httpModules>

     

    补充:

    1:在此例子中我们实现的是一个简单的登陆验证,在。NET2.0中的十六个事件中,其中只有PreRequestHandlerExecute、AcquireRequestState、PostAcquireRequestState、PostRequestHandlerExecute这4个可以访问SESSION.

    2:在Web.config中,httpModules由名字空间、类名称和程序集名称组成

    posted on 2010-09-19 15:38  闷蛋  阅读(2112)  评论(5编辑  收藏  举报