网站首页 语言 会计 互联网计算机 医学 学历 职场 文艺体育 范文
当前位置:学识谷 > 范文 > 热点

ASPNET是怎样在IIS下工作的

栏目: 热点 / 发布于: / 人气:1.07W

与IIS是紧密联系的,由于IIS6.0与IIS7.0的工作方式的不同,导致的工作原理也发生了相应的变化。

ASPNET是怎样在IIS下工作的

IIS6(IIS7的经典模式)与IIS7的集成模式的不同

IIS6的运行过程:

分析上图可知:

在 User Mode 下, 接收到 http request,然后它会根据 IIS 中的 Metabase 查看基于该 Request 的 Application 属于哪个 Application Pool, 如果该 Application Pool 不存在,则创建之。否则直接将 request 发到对应 Application Pool 的 Queue中。每个 Application Pool 对应着一个 Worker Process — ,(运行在 User Mode 下)。

在 IIS Metabase 中维护着 Application Pool 和 Worker Process 的Mapping。WAS(Web Administrative Service)根据这样一个 mapping,将存在于某个 Application Pool Queue 的 request 传递到对应的 Worker Process (如果没有,就创建这样一个进程)。在 Worker Process 初始化的时候,加载 ISAPI, ISAPI 进而加载 CLR。最后通过 AppManagerAppDomainFactory 的 Create 方法为 Application 创建一个 Application Domain;通过 ISAPIRuntime 的 ProcessRequest 处理 Request,进而将流程进入到 Http Runtime Pipeline。

几个知识点:

:(Kernel)的一个组件,它负责侦听(Listen)来自于外部的HTTP请求,根据请求的URL将其转发给相应的应用程序池 (Application Pool)。当此HTTP请求处理完成时,它又负责将处理结果发送出去.为了提供更好的性能,内部建立了一个缓冲区,将最近的HTTP请求处理结果保存起来。

Application Pool: IIS总会保持一个单独的工作进程:应用程序池。所有的处理都发生在这个进程里,包括ISAPI dll的执行。对于IIS6而言,应用程序池是一个重大的改进,因为它们允许以更小的粒度控制一个指定进程的执行。你可以为每一个虚拟目录或者整个Web 站点配置应用程序池,这可以使你很容易的把每一个应用程序隔离到各自的进程里,这样就可以把它与运行在同一台机器上其他程序完全隔离。从Web处理的角度看,如果一个进程死掉,至少它不会影响到其它的进程。

当应用程序池接收到HTTP请求后,交由在此应用程序池中运行的工作者进程Worker Process: 来处理此HTTP请求。

Worker Process: 当工作者进程接收到请求后,首先根据后缀找到并加载对应的ISAPI扩展 (如:aspx 对应的映射是aspnet_),工作者进程加载完aspnet_后,由aspnet_负责加载 应用程序的运行环境即CLR ( Runtime)。

Worker Process运行在非托管环境,而中的对象则运行在托管环境之上(CLR),它们之间的桥梁就是ISAPI扩展。

WAS(Web Admin Service):这是一个监控程序,它一方面可以存取放在InetInfo元数据库(Metabase)中的各种信息,另一方面也负责监控应用程序池(Application Pool)中的工作者进程的工作状态况,必要时它会关闭一个老的工作者进程并创建一个新的取而代之。

IIS7的运行过程:

分析上图可知:

1、当客户端浏览器开始 HTTP 请求一个WEB 服务器的资源时, 拦截到这个请求。

2、 联系 WAS 获取配置信息。

3、WAS 向配置存储中心(ig)请求配置信息。

4、WWW 服务接收到配置信息,配置信息指类似应用程序池配置信息,站点配置信息等等。

5、WWW 服务使用配置信息去配置 处理策略。

6、WAS为请求创建一个进程(如果不存在的话)。

7、工作者进程处理请求并对做出响应。

8、客户端接受到处理结果信息。

除了IIS的整体运行方式不同之外,IIS7相比IIS6最大的不同之处在于它提供了两种应用程序池管道模式:

经典模式:是与IIS 6或者之前版本保持兼容的一种模式,一个典型问题就是,在处理这种动态网站的时候,它是通过一个所谓的ISAPI程序,作为插件的方式来工作的。针对不同的动态应用程序(例如ASP,PHP等),会需要不同的ISAPI(Internet Server Application Programe Interface,互联网服务器应用程序接口)。如图,在IIS中,打开“处理程序映射”,可以看到aspx类型页面的处理程序为aspnet_。

下图展示了IIS7经典模式与IIS6的应用程序池管道模式运行原理,针对不同的请求,会指定不同的ISAPI(dll)进行处理:

集成模式:不再像IIS6一样只限定于aspnet_中,而是被解放出来,从IIS接收到HTTP请求开始,即进入的控制范围,可以存在于一个请求在IIS中各个处理阶段。允许我们将更好地与IIS集成,甚至允许我们在中编写一些功能(例如Module)来改变IIS的行为(扩 展)。集成的好处是,不再通过ISAPI的'方式,提高了速度和稳定性。至于扩展,则可以使得我们对于IIS,以及其他类型的请求有更多的控制。(例如,我 们希望静态网页也具备一些特殊的行为)。如图

如下图在IIS7集成模式中,打开处理程序映射,可以看到aspx类型页面所对应的不再是一个dll,而是一个类型。

总结与扩展:

对于处理应用程序而言,IIS6及IIS7的经典模式需要aspnet_来处理,而IIS7集成模式不需要aspnet_来处理,而可以直接根据文件扩展名找到相应的处理程序接口。例如aspx的处理程序是HandlerFactory类型。

介绍完IIS的工作原理,来看一下内部的运行机制。

首先看一下IIS处理模型:

上面介绍IIS工作原理时,已经介绍了从发起HTTP请求,到响应请求的过程,这里主要介绍当请求到达 Runtime之后,运行时所发生的一系列工作。

先看如下的运行时工作序列图:

请求进入Web服务器后,首先由来判断请求的页面是否存在,如果存在的话将把请求信息转交给 Runtime。在这部分实际是完成两个步骤,在将请求转交给 Runtime的同时将请求信息封存在HTTPWorkRequest类中供其它步骤调用。HttpWorkRequest类在以后的操作中至关重要,它第一次将Http请求信息转换为类信息。

2.当请求到达 Runtime后,接下来的操作将会在托管环境中完成,这时请求就真正进入了中,对请求信息的操作是由的底层类库来实现。首先 Runtime将会针对请求信息做两个动作,一是准备HostingEnvironment;二是调用ApplicationManager类为HTTP请求动态的分配AppDomain,并把处理权交给AppDomain。

请求进入AppDomain后,将由对象ISAPIRuntime来接管,一方面经方法ProcessRequest()得到HttpWorkerRequest对象,另一方面由方法StartProcessing()生成HttpRuntime对象,接下来把处理权交给了HttpRuntime(HttpWorkerRequest对象将作为HttpRuntime方法中的参数被使用)。

Runtime接收到Http请求后,方法ProcessRequest处理请求。将对第1步中的HTTPWorkRequest类中的信息进行操作,具体的实现由ProcessRequest方法实现。内部代码如下:

[AspNetHostingPermission(nd, Level=um)]public static void ProcessRequest(HttpWorkerRequest wr){if (wr == null){throw new ArgumentNullException("wr");}if (UseIntegratedPipeline){throw new PlatformNotSupportedException(tring("Method_Not_Supported_By_Iis_Integrated_Mode", new object[] { "essRequest" }));}ProcessRequestNoDemand(wr);}internal static void ProcessRequestNoDemand(HttpWorkerRequest wr){RequestQueue queue = _theRuntime._requestQueue;if (queue != null){wr = equestToExecute(wr);}if (wr != null){CalculateWaitTimeAndUpdatePerfCounter(wr);tStartTime();ProcessRequestNow(wr);}}internal static void ProcessRequestNow(HttpWorkerRequest wr){_essRequestInternal(wr);}

5.在HttpRunTime中经过一系列的驱动后,将会在ProcessRequestInternal方法中为Http请求分配应用程序。在这一步中还将创建HttpContext对象。

context = new HttpContext(wr, false); // 基于HttpWorkerRequest生成HttpContextIHttpHandler applicationInstance = pplicationInstance(context); // 得到nProcessRequest(context, this._handlerCompletionCallback, context); // 由HttpApplication处理请求

6.经过步骤5后HTTP请求信息才由基本信息转交给了中的各个对象。接下来的操作会触发一些列的管道事件,这时的请求才真正转到HttpModule和HttpHandler中。

接下来我们看看常说的管道事件的创建过程:

internal override void BuildSteps(WaitCallback stepCallback){ArrayList steps = new ArrayList();HttpApplication app = base._application;bool flag = false;UrlMappingsSection urlMappings = onfig()appings;flag = abled && (t > 0);(new datePathExecutionStep(app));if (flag){(new appingsExecutionStep(app));}teEventExecutionSteps(tBeginRequest, steps);teEventExecutionSteps(tAuthenticateRequest, steps);teEventExecutionSteps(tDefaultAuthentication, steps);teEventExecutionSteps(tPostAuthenticateRequest, steps);teEventExecutionSteps(tAuthorizeRequest, steps);teEventExecutionSteps(tPostAuthorizeRequest, steps);teEventExecutionSteps(tResolveRequestCache, steps);teEventExecutionSteps(tPostResolveRequestCache, steps);(new andlerExecutionStep(app));teEventExecutionSteps(tPostMapRequestHandler, steps);teEventExecutionSteps(tAcquireRequestState, steps);teEventExecutionSteps(tPostAcquireRequestState, steps);teEventExecutionSteps(tPreRequestHandlerExecute, steps);(new HandlerExecutionStep(app)); //调用teEventExecutionSteps(tPostRequestHandlerExecute, steps);teEventExecutionSteps(tReleaseRequestState, steps);teEventExecutionSteps(tPostReleaseRequestState, steps);(new FilterExecutionStep(app));teEventExecutionSteps(tUpdateRequestCache, steps);teEventExecutionSteps(tPostUpdateRequestCache, steps);this._endRequestStepIndex = t;teEventExecutionSteps(tEndRequest, steps);(new ExecutionStep());this._execSteps = new cutionStep[t];To(this._execSteps);this._resumeStepsWaitCallback = stepCallback;}

管道事件请求序列图如下:

Tags:aspnet IIS