Asp.net请求处理之管道处理介绍
程序员文章站
2024-03-05 14:39:42
在了解asp.net请求处理流程的过程中,个人认为有必要从源代码的角度来了解asp.net管道是怎么实现的。 在此之前大家有必要了解一些asp.net请求流程的基本东东,如...
在了解asp.net请求处理流程的过程中,个人认为有必要从源代码的角度来了解asp.net管道是怎么实现的。
在此之前大家有必要了解一些asp.net请求流程的基本东东,如asp.net 请求处理流程、asp.net管道、asp.net管线与应用程序生命周期
我们大家都知道httpruntime主要的方法是
public static void processrequest(httpworkerrequest wr)
我们看到里面有这么一句
ihttphandler applicationinstance = httpapplicationfactory.getapplicationinstance(context);用来获取httpapplication,而httpapplication实现了ihttpasynchandler接口public class httpapplication : ihttpasynchandler, ihttphandler, icomponent, idisposable,最后调用application的beginprocessrequest方法。
httpapplicationfactory.getapplicationinstance(context)主要是调用getnormalapplicationinstance
在getnormalapplicationinstance里面有一个比较关键的方法application.initinternal(context, this._state, this._eventhandlermethods);我们猜测它是做application初始化的工作,包括http管道的初始化。
这个方法关键的代码在于:
我想大家看到这里就会明白为什么iis7会有集成模式和经典模式了吧。可能大家不怎么重视此代码,让我们来看看经典模式的applicationstepmanager
说简单一点这个类中的internal override void buildsteps(waitcallback stepcallback)方法就是为我们注册那19个管道事件, internal override void resumesteps(exception error)就是依次执行此管道事件,而 steps.add(new httpapplication.maphandlerexecutionstep(app));是映射我们的handler
里面的调用主要是
context.handler = this._application.maphttphandler(context, request.requesttype, request.filepathobject, request.physicalpathinternal, false);
而httpapplication的maphttphandler如下:
在maphttphandler里创建了ihttphandlerfactory,进而创建了httphandler。
在applicationstepmanager中buildsteps的方法有steps.add(new httpapplication.callhandlerexecutionstep(app));这么一句,这就是注册调用我们hanndler的地方。
在代码中我们看到handler2.beginprocessrequest(context, this._completioncallback, null);。。。handler.processrequest(context);这2句代码是不是很熟悉啊。
在让我们回头看看httpapplication的beginprocessrequest方法
里面调用了resumesteps方法
回到我们先前的applicationstepmanager的resumesteps方法,里面有一句
error = application.executestep(this._execsteps[this._currentstepindex], ref completedsynchronously);
ahhpaplication的executestep方法
是真正执行iexecutionstep的execute方法。
通过以上的分析我们可以简单的理解asp.net在管道模式下管道主要是通过applicationstepmanager来注册和调用的。集成模式下的pipelinestepmanager和applicationstepmanager结构类似。
个人在这里只是抛砖引玉,希望大家拍砖。
在此之前大家有必要了解一些asp.net请求流程的基本东东,如asp.net 请求处理流程、asp.net管道、asp.net管线与应用程序生命周期
我们大家都知道httpruntime主要的方法是
public static void processrequest(httpworkerrequest wr)
我们看到里面有这么一句
ihttphandler applicationinstance = httpapplicationfactory.getapplicationinstance(context);用来获取httpapplication,而httpapplication实现了ihttpasynchandler接口public class httpapplication : ihttpasynchandler, ihttphandler, icomponent, idisposable,最后调用application的beginprocessrequest方法。
httpapplicationfactory.getapplicationinstance(context)主要是调用getnormalapplicationinstance
在getnormalapplicationinstance里面有一个比较关键的方法application.initinternal(context, this._state, this._eventhandlermethods);我们猜测它是做application初始化的工作,包括http管道的初始化。
这个方法关键的代码在于:
我想大家看到这里就会明白为什么iis7会有集成模式和经典模式了吧。可能大家不怎么重视此代码,让我们来看看经典模式的applicationstepmanager
说简单一点这个类中的internal override void buildsteps(waitcallback stepcallback)方法就是为我们注册那19个管道事件, internal override void resumesteps(exception error)就是依次执行此管道事件,而 steps.add(new httpapplication.maphandlerexecutionstep(app));是映射我们的handler
里面的调用主要是
context.handler = this._application.maphttphandler(context, request.requesttype, request.filepathobject, request.physicalpathinternal, false);
而httpapplication的maphttphandler如下:
在maphttphandler里创建了ihttphandlerfactory,进而创建了httphandler。
在applicationstepmanager中buildsteps的方法有steps.add(new httpapplication.callhandlerexecutionstep(app));这么一句,这就是注册调用我们hanndler的地方。
在代码中我们看到handler2.beginprocessrequest(context, this._completioncallback, null);。。。handler.processrequest(context);这2句代码是不是很熟悉啊。
在让我们回头看看httpapplication的beginprocessrequest方法
里面调用了resumesteps方法
回到我们先前的applicationstepmanager的resumesteps方法,里面有一句
error = application.executestep(this._execsteps[this._currentstepindex], ref completedsynchronously);
ahhpaplication的executestep方法
是真正执行iexecutionstep的execute方法。
通过以上的分析我们可以简单的理解asp.net在管道模式下管道主要是通过applicationstepmanager来注册和调用的。集成模式下的pipelinestepmanager和applicationstepmanager结构类似。
个人在这里只是抛砖引玉,希望大家拍砖。