动手写这个系列之前,我犹豫不决,因为类似的文章在博客圆中,已经不少了,感觉有点不好意思:)园中,有位朋友说过这样一句话,“我们不要重复发明轮子,而要扩展轮子”,那我就当自己是在“扩展轮子“,给自己找个由头吧!
在我的博客中,第一篇写的就是asp.net运行时流程,园子里的朋友给了很多的宝贵意见,在此谢过了。也有朋友说,太抽象了,不够细。所以我在工作之余,抽出时间写下这点东西!
还是先贴一张图,所谓一图胜万言,使大家对运行时,有一个全局的把握。
图很明了,三个椭圆,不,应该是四个,第一个是asp.net的运行环境,当请求到达www服务inetinfo.exe后,经过aspnet_isapi.dll筛选之后,请求这才真正进入aspnet_wp.exe进程,也就是httpRuntime,之后系统会加载一系列的HttpModule,那么我们就来看看系统到底加载了哪些模块。先定位到“C:"WINDOWS"Microsoft.NET"Framework"v2.0.50727"CONFIG“,怪了,这个目录很是熟悉,是的,这是.net系统配置文件machine.config所在的目录。不过我今天要找的不是他,而是web.config,这是.net专门给web独立定义connfig文件,没错,web.cofig也在此目录中。
打开web.config文件后,大家可能很郁闷,这么多的数据,怎么看呢!大家别急,都知道web.config文件是合法的xml文件,那我们就把扩展名config改成xml得了,再用IE打开,数据就一目了然了!
很明显,Congfiguration根,包括注释一起,才四个主元素,我们打开system.web节点,
也很明显,可以看到系统对“输出缓存”,“会话”,“验证和授权”等模块都一一进行配置加载。记得有朋友问,为什么在自定义的httpModule中,使用Session[“key”]的时候都会抛出null对象异常呢?我告诉大家,那是因为Session在此时,还没有生成,所以在自定义的httpModule中使用Session,那都是瞎忙活!
有人可能会问,说了这么多,自定义的HttpModule到底有什么用呢?先别急,我们先来看看系统的IHttpModule接口的真面目!
[AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal),
AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)]
public interface IHttpModule
{
// Methods
void Dispose();
void Init(HttpApplication context);
}
很明显,从字面意思,就可以看出这两个方法的作用, Init()用来初始化一个module,传递一个HttApplication对象作为参数,为以后捕获处理请求做一些准备,Dispose()用来销毁不再被module所使用的资源!注意,运行时的大部分方法都是调用HttApplication对象的方法,严格说,应该是向HttApplication对象订阅。
下面我们就动手来写一个自己的HttpModule!
第一步,新建一类库!
class MyHttpModuleClass:System.Web.IHttpModule//实现IHttpModule接口
{
public MyHttpModuleClass()
{ }
public void Init(HttpApplication application)//实现Init方法
{
application.BeginRequest+=new EventHandler(this.application_BeginRequest);
application.EndRequest+=new EventHandler(this.application_EndResponse);
}
private void application_BeginRequest(Object obj, EventArgs e)
{
HttpApplication application = (HttpApplication)obj;
HttpContext context = application.Context;
HttpRequest request = context.Request;
HttpResponse response = context.Response;
response.Write("hi ,i am from application_BeginRequest"+"</br>");
}
private void application_EndResponse(Object obj, EventArgs e)
{
HttpApplication application = (HttpApplication)obj;
HttpContext context = application.Context;
HttpRequest request = context.Request;
HttpResponse response = context.Response;
response.Write("hi ,i am from application_EndResponse");
}
public void Dispose()//实现Dispose方法,但什么也不做
{ }
}
第二步
新建一website,在她的web.config中,加上httpModules节点!
<httpModules>
<add name="wmjHttpModule" type="MyHttpModule.MyHttpModuleClass"/>
</httpModules>
注意wmjHttpModule为别名,可以随便起,MyHttpModule为程序集名称,MyHttpModuleClass为自定义的IHttpModule类名!
第三步
编译类库,然后把dll拷贝到GAC,或者website的bin目录下面,如果是直接放bin目录下,那么配置文件就没必要加上程序集的名称了
<httpModules>
<add name="wmjHttpModule" type="MyHttpModuleClass"/>
</httpModules>
第四步
按F5,您是不是看到这两句话了呢?
hi ,i am from application_BeginRequest
hi ,i am from application_EndRequest
最后,祝大家好运!