以IIS 6.0为例,它在工作进程w3wp.exe中会利用aspnet_isapi.dll加载.Net运行时(如果运行时尚未加载)。一个工作进程对应着一个应用程序池,一个应用程序池可以承载一个或多个web应用。

  如果Http.sys接收到的Http请求是对该Web应用的第一次访问,在成功加载运行后,IIS会通过AppDomainFactory为该Web应用创建一个应用程序域。随后一个特殊的运行时IsapiRuntime被加载,被加载的IsapiRuntime会接管该Http请求。

  接管Http请求的IsapiRuntime会首先创建一个IsapiWorkerRequest对象来封装当前的Http请求,随后将此对象床底给Asp.Net运行时HttpRuntime。从此时起,Http请求正式进入了Asp.Net管道。HttpRuntime会根据IsapiWorkerRequest对象创建用于表示当前Http请求的上下文对象HttpContext。

  随着HttpContext的床啊进,HttpRuntime会利用HttpApplicationFactory创建新的或获取现有的HttpApplication对象。实际上Asp.Net维护着一个HttpApplication对象池。

  在HttpApplication初始化过程中,Asp.Net会根据配置文件加载并初始化注册的HttpModule对象。对于HttpApplication来说,在它处理Http请求的不同阶段会触发不动的事件,而HttpModule的意义在于通过注册Httpapplication的相应时间,将所需要的操作注入到整个Http请求的处理流程。Asp.Net的很多功能(如身份验证、授权、缓存等)都是通过相应的HttpModule实现的。

  最终完成对Http请求的处理实现在HttpHandler中,不同的资源类型对应着不同类型的HttpHandler。比如aspx页对应的HttpHandler类型为System.Web.UI.Page。

  HttpApplication是真个Asp.Net基础架构的核心,它负责处理分发给他的Http请求。由于一个HttpApplication对象在某个时刻只能处理一个请求,只有完成某个请求的处理后才能用于后续请求的处理,所以Asp.Net采用对象池的机制来获取HttpApplication对象。

 

posted on 2017-08-03 17:39  歪脖子  阅读(85)  评论(0)    收藏  举报