初窥asp.net Runtime (转载)

动手写这个系列之前,我犹豫不决,因为类似的文章在博客圆中,已经不少了,感觉有点不好意思:)园中,有位朋友说过这样一句话,“我们不要重复发明轮子,而要扩展轮子”,那我就当自己是在“扩展轮子“,给自己找个由头吧!

在我的博客中,第一篇写的就是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接口的真面目!

[(., =.), 
(., =.)]
public interface IHttpModule
{
// Methods
Dispose();
Init( 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

最后,祝大家好运!

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章