最近几天开始学习.NET运行的相关知识,其中涉及到 IHttpModule 与 IHttpHandler 两个部份,<br/>
也是我们每一个。NET程序中负责处理我们相应代码的两大部份!<br/>
在这里说说我对这两个部份的入门级认识,有什么错误之处希望大家可以指正指正!<br/>
首先是IHttpModule 接口,从MSDN中获得的代码如下:
利用IHttpModule我们可以一些需要的功能: 例如:1:预处理 (验证、修改、过虑..)2:URL重写 3:访问日志 4:流量统计等等 第一个方法我相信大家也大概可以知道有什么作用了吧? 现在我们看下第二个方法: 在此方法中初始化了我们很多平时需要用到的数据:SERVER、REQUEST、REPONSE、Application、SESSION等等<br/> 此方法里也按照以下执行顺序由GLOBAL.ASPX文件中定义的模块与用户代码处理事件(.NET 2.0版本) 在 PostResolveRequestCache 事件之后、PostMapRequestHandler 事件之前创建一个事件处理程序<br/>(对应于请求 URL 的页)。 PostMapRequestHandler 执行事件处理程序。 在 PostReleaseRequestState 事件之后,响应筛选器(如果有)将对输出进行筛选。 |
以下是一个登录验证的例子,希望有助于大家去理解:
代码
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由名字空间、类名称和程序集名称组成