众所周知,浏览器端发送请求,一般而已(针对IIS服务器,OWIN等情况下不知道)都是由IIS服务器监听到请求,然后交由IIS服务器处理,之后通过ISAPI联通asp.net管道(托管).,在ASP.NET管道处理结束,再交由IIS处理打包,最后返回给客户端。asp.net大致就是这么一个流程,其中ISAPI就是联通非托管和托管的桥梁(也就是沟通IIS和asp.net)。
当从IIS中进入asp.net时,加载运行时,之后会通过AppDomainFactory为该Web应用创建一个应用程序域(AppDomain),随后,一个特殊的运行时IsapiRuntime被加载。IsapiRuntime定义在程序集System.Web中,对应的命名空间为System.Web.Hosting。IsapiRuntime会接管该HTTP请求。随后,首先创建一个IsapiWorkerRequest对象,用于封装当前的HTTP请求。并将该IsapiWorkerRequest对象传递给ASP.NET运行时:HttpRuntime,从此时起,HTTP请求正式进入了ASP.NET管道。根据IsapiWorkerRequest对象,HttpRuntime会创建用于表示当前HTTP请求的上下文(Context)对象:HttpContext。
随着HttpContext被成功创建,HttpRuntime会利用HttpApplicationFactory创建新的或者获取现有的HttpApplication对象。
每一个HttpApplication对象每一次仅仅处理一个请求,在HttpApplication中利用.net的事件机制,分解为多个步骤。(HttpApplication实例是由asp.net运行时调用函数创建的,程序员只能通过处理管道中的事件来影响处理过程).
对于HttpContext:
HttpContext基于HttpApplication的处理管道(asp.net定义HttpContext类型来统一处理参数的表示问题),由于HttpContex对象贯穿整个处理过程,所以,可以从HttpApplication处理管道的前端将状态数据传递到管道的后端,完成状态的传递任务。
HttpContex生命周期:从服务器接收的HTTP请求开始到反应发送回客户端结束。也就是从客户端用户点击并产生了一个向服务器发送请求开始---服务器处理完请求并生成返回到客户端为止。针对每个不同用户的请求,服务器都会创建一个新的HttpContext实例直到请求结束,服务器销毁这个实例。