现在的位置: 首页 > 综合 > 正文

学习《ASP.NET Framework深度历险》(2)

2011年06月24日 ⁄ 综合 ⁄ 共 3562字 ⁄ 字号 评论关闭

这几天一直在忙期末考试,都没时间来看看书了。

HttpModule在ASP.NET Framework中的位置

一个来自于客户端的HTTP请求被截获后经过层层转交(怎么都在踢皮球?呵呵)到达了HttpModule这个“请求监听器”。HttpModule就类似于安插在ASPNET_WP.EXE进程中的一个***,稍微有些常识的人都会很自然的想象得到***是用来做什么的,而我们的HttpModule可以说是作***的绝好人选了,但是需要明确的是,HttpModule绝对不是简单的监听器,它可以做到更多的东西,比如它可以对截获的请求增加一些内容等等。那么HttpModule在整个ASP.NET Framework中的位置处在哪里呢?下面我们通过图示来看看:

另外需要明白的是,当一个HTTP请求到达HttpModule的时候,整个ASP.NET Framework系统还并没有对这个HTTP请求做任何的真正处理,也就是说此时对于HTTP请求来讲,HttpModule只是它路过的一个地方而以。但是正是因为HttpModule是一个HTTP请求的“必经之路”,所以我们可以在这个HTTP请求传递到真正的请求处理中心(HttpHandler)之前附加一些我们需要的信息在这个HTTP请求信息之上,或者针对我们截获的这个HTTP请求信息作一些额外的工作,或者在某些情况下干脆终止满足一些条件的HTTP请求,从而可以起到一个Filter过滤器的作用,而不仅仅是一个***了。通过查阅MSDN(不要去相信.NET SDK自带的那个QuickStarts Web文档,正式版本中竟然在很多地方没有更新这个文档,很多东西在正式版本是无效的),你会发现系统HttpModule实现了一个叫做IHttpModule的接口,很自然的就应当想到,只要我们自己的类能够实现IHttpModule接口,不就可以完全替代系统的HttpModule了吗?完全正确。在我们开始自己的HttpModule类之前,我先来告诉你系统中的那个HttpModule是什么样子的,ASP.NET系统中默认的HttpModule有以下几个:
System.Web.Caching.OutputCacheModule System.Web.SessionState.SessionStateModule System.Web.Security.WindowsAuthenticationModule System.Web.Security.FormsAuthenticationModule System.Web.Security.PassportAuthenticationModule System.Web.Security.UrlAuthorizationModule System.Web.Security.FileAuthorizationModule 这些系统默认的HttpModule是在文件machine.config中配置,这个文件位于你安装的.NET框架所在的目录中,比如在你的系统文件目录中的C:\WINNT\Microsoft.NET\Framework\v1.0.3705\CONFIG\machine.config。在我们开发ASP.NET 应用程序的时候会频繁的使用到一个web.config配置文件,那么这个machine.config和我们常见的web.config有什么关系呢?原来在ASP.NET Framework启动处理一个Http Request的时候,她会依次加载machine.config以及你请求页面所在目录的web.config文件,里面的配置是有标签的,什么意思不说也知道了吧。如果你在machine.config中配置了一个自己的HttpModule,你仍然可以在离你最近web.config文件中“remove”掉这个映射关系。

构建我们自己的HttpModule
在上一小节中,我们谈到了系统默认的各个HttpModule均继承实现了一个叫做IhttpModule的接口。我们先来看看这个接口的真实面目吧:
语法:public interface IHttpModule
需求:名称空间: System.Web
平台: Windows 2000, Windows XP Professional, Windows .NET Server family
装配件: System.Web (in System.Web.dll)
公共成员方法:void Dispose(); 参数:无返回值:void 作用:销毁不再被module所使用的资源。
void Init(HttpApplication context); 参数:HttpApplication类型的实例返回值:void 作用:初始化一个module,为捕获HTTP请求做出一些准备。
了解了接口IhttpModule的方法,我们也就知道了如何去实现它了。接下来,我们来开始我们自己的HttpModule构建历程吧。
1) 打开VS.NET新建一个“Class Library”项目,将它命名为MyHttpModule。
2) 引用System.Web.dll文件在代码区域敲入:

 

using System; 
using System.Web; 
namespace MyHttpModuleTest 
/// 
/// 说明:用来实现自定义HttpModule的类
/// 作者:uestc95 
/// 联系:uestc95@263.net 
/// 

public class MyHttpModule:IHttpModule

/// 
/// 说明:构造器方法
/// 作者:uestc95 
/// 联系:uestc95@263.net 
/// 

public MyHttpModule() { } 
///
/// 说明:实现IHttpModule接口的Init方法
/// 作者:uestc95 
/// 联系:uestc95@263.net 
/// 
/// HttpApplication类型的参数

public void Init(HttpApplication application) 
application.BeginRequest 
+=new EventHandler(this.Application_BeginRequest); application.EndRequest +=new EventHandler(this.Application_EndRequest); 
}
 
/// 
/// 说明:自己定义的用来做点事情的私有方法
/// 作者:uestc95 
/// 联系:uestc95@263.net 
/// 
/// 传递进来的对象参数
/// 事件参数

private void Application_BeginRequest(Object obj,EventArgs e) 

//声明HttpApplication 
HttpApplication application=(HttpApplicationobj; 
HttpContext context
=application.Context; HttpResponse response=context.Response; 
HttpRequest request
=context.Request; response.Write("我来自Application_BeginRequest,:)"); 
}
 
/// 
/// 说明:自己定义的用来做点事情的私有方法
/// 作者:uestc95 
/// 联系:uestc95@263.net 
/// 
/// 传递进来的对象参数
/// 事件参数

private void Application_EndRequest(Object obj,EventArgs e) 
{ HttpApplication application=(HttpApplication)obj; 
HttpContext context
=application.Context; HttpResponse response=context.Response; HttpRequest request=context.Request; response.Write("我来自Application_EndRequest,:)"); }
 /// /// 说明:实现IHttpModule接口的Dispose方法/// 作者:uestc95 /// 联系:uestc95@263.net /// public void Dispose(){} 

抱歉!评论已关闭.