Asp.Net Http请求剖析

图-1

     当客户端向远程服务端发送请求的过程中,总体可拆分成两个阶段,Http请求阶段和页面生命周期阶段.今天的主题就是浅谈下我们发送Http请求到Http请求的实际处理中心HttpHandler中涉及的一系列复杂的过程。(如图-1所示)

阶段1

      当用户发出一个请求的时候,最先捕获Http请求的是Http.Sys组件,这是一个在Win2003(实际在Windows XP SP2系统中已经存在)中新建的一个组件,任何应用程序可以利用它提供的接口进行Http的通信,其内核中存在一片缓存区,用于储存最近处理的Http的请求,提供服务器的响应速度。

阶段2:

    Http请求通过了组件后,IIS会根据请求页面的后缀名检索ISAPI列表,找到对应的程序集处理(一般aspx会注册给aspnet_isapi.dll).ISAPI获得控制权后,会从组件拿得到Http请求的信息,并且添加到Worker Process里面,也就是W3wp.exe,是不是很熟悉呢,就是我们在调试的时候附加的进程。

阶段3:

    W3wp.exe进程会根据当前请求的应用程序创建Appdomain,在创建之前,会进行一个判断,判断当前应用程序池有没有这个Appdomain,没有的话才会去创建。并且在创建的同时加载应用所需的程序集和ISAPIRuntime.ISAPIRuntime会执行ProcessRequest方法,创建一个HttpWorkerRequest的对象,并将对象传递给HttpRuntime。(如图-2所示)

图-2

阶段4:

      HttpRuntime接受到了HttpWorkerRequest对象后会生成HttpContext类,HttpContext包含了Http请求的所有信息。其中两个非常重要的属性Request和Response提供了对HttpReques和HttpResponse类的编程式访问,Request可以获得请求的一些信息,比如Url和Form表单。Response则负责向浏览器输出信息,那么HttpRuntime是如何利用传递过来的HttpWorkerRequest对象生成HttpContext对象的呢,图-3,图-4,图5详细的描述了这一过程。具体不用纠结怎么实现,明白结果生成了一个Context对象就行。

 

图-3

图-4

图-5

 

      HttpRuntime不仅接受HttpWorkerRequest对象生成HttpContext类,还会把HttpContext对象传递给HttpApplicationFactory,使其产生一个HttpApplication实例。其中执行了GetNormalApplicationInstance()方法后,将会生成一个HttpApplication的实例并调用InitInternal()方法

图-6

图-7

      到此为止,我们已经创建了一个HttpApplication的实例,接下来就是把实例传递给HttpModule了,HttpModule是一类统称,是指实现了IHttpModule接口的类,在Http请求到达HttpModule的时候,.NetFrameWork还没有对请求做真正的处理,我们可以在HttpModule中给请求添加或者过滤。图-8,图-9分别展现了如果自定义一个HttpModule以及HttpModule中触发的一些事件。

图-8

图-9

 

经过了HttpModule后,到达Httphandler之前,大部分的时候还要经历过一个工厂阶段,何为工厂阶段呢,实际上是一个实现了IHttpHandlerFactory接口的类,接口定义了两个方法,如图-10所示

     一个工厂可以注册多个HttpHandler(废话,不然怎么叫工厂模式呢),根据参数的不同,分别做不一样的逻辑处理。它实际是对HttpHandler统一的管理,返回一个HttpHandler的实例,再调用HttpHandler实例的ProcessRequest方法,完成19个页面周期的委托事件,最后生成Html标记展现在我们面前。

 

posted @ 2015-03-29 20:56  落幕童话  阅读(797)  评论(0)    收藏  举报