欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Asp.net请求处理之管道处理介绍

程序员文章站 2024-03-06 16:33:56
在了解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结构类似。

个人在这里只是抛砖引玉,希望大家拍砖。