naotang的测试成长空间,记录工作中的问题,学习中的心得。 个人网站:www.naotang.com

Http请求处理过程

上一篇 / 下一篇  2007-12-29 14:18:07 / 个人分类:Web测试

51Testing软件测试网7cj1a)a;H ZaD z:J

   当服务器接收到一个 Http请求的时候,IIS 首先需要决定如何去处理这个请求。那IIS依据什么去处理呢?―根据文件的后缀名。51Testing软件测试网8cHt!fl.H.};B8C@

@#YI,fq5V5CT0   服务器获取所请求的页面(NOTE:也可以是文件,比如.jpg图片文件)后缀名以后,接下来会在服务器端寻找可以处理这类后缀名的应用程序,如果IIS找不到可以处理此类文件的应用程序,并且这个文件也没有受到服务器端的保护(NOTE:一个受保护的例子就是App_Code中的文件,一个不受保护的例子就是你的js脚本),那么IIS将直接把这个文件返还给客户端。
x|/N.MkB0
G-|6OqY}0   能够处理各种后缀名的应用程序,通常被称为 ISAPI 应用程序(NOTE:Internet Server Application Programe Interface,互联网服务器应用程序接口)。它实际上只是一个接口,起到一个代理的作用,它的主要工作是映射所请求的页面(文件)和与此后缀名相对应的实际处理程序。
1CAF*UmHe o0  51Testing软件测试网`&|-K8?%q,C4Lpz
   让我们更进一步地看一下 ISAPI ,看看它到底是什么样子,请按下面的步骤进行:51Testing软件测试网7F1?xQ4SE0p
   1、打开以IIS。
|/a?+md0   2、选择随意一个站点,鼠标右键,“属性”。51Testing软件测试网4R-c4zh#B&Y ?
   3、选择“主目录”选项卡。51Testing软件测试网 R[6ZB:S B(_8z
   4、选择“配置”。

}@ ?6H}X0

?3Kcx.Vl0

#oPuK`0   你应该会看到如下的画面:51Testing软件测试网5Bo0f4@b|qeX

51Testing软件测试网_%hfk'Hf8w{

X5ds q\q`Qp0   图1. 应用程序配置51Testing软件测试网"D^s#e.n'|0j
  51Testing软件测试网i"X?$Q"lu:Pp^

51Testing软件测试网3Itj%b.R9}b6p&W

HB? xkWx"n\s0

(d:^ UJzz_Y YD0

#@4qnmnk0

8uP2P~ i!M V#t.C c051Testing软件测试网^FMx }p/C C

   很清楚地就可以看到,所有IIS所能处理,或者叫 ISAPI所提供代理服务的文件类型及其相对应的实际的后台处理程序都在这里清楚地列出来了。
I%BCC%|&m0  
1j J ht;kr$fH*}e0   我们找到 .aspx 的应用处理程序,然后点“编辑”,会出现下面的画面:51Testing软件测试网 s?z%T/{'i7qhq`

}%ppV*l"F0

*yCM zA*I0   图2. 编辑.aspx文件的处理程序51Testing软件测试网F)T+Pu a;?L3cw0Z
  51Testing软件测试网/\(\l~-y1B0t

A J/As|Mw0

Gr l1SB$L#o(R#a!b)~051Testing软件测试网+iQ(z%HU;d5pE

+|5m#` g ]Dz:T QPJ051Testing软件测试网 a?jCMu$bn{;V-rHHK

QC5E0u)Nz0   一路看到这里,可以看出,所有的.aspx文件实际上都是由 aspnet_isapi.dll 这个程序来处理的,当IIS把对于.aspx页面的请求提交给了aspnet_isapi.dll以后,它就不再关心这个请求随后是如何处理的了。现在我们应该知道:Asp.Net 只是服务器(IIS)的一个组成部分而已,它是一个 ISAPI扩展。

@7S:^Mb6d-vH4S0

5O8XB6t:OKa O"Y0理解宿主环境(Hosting)51Testing软件测试网 g nQjpkV5Vg

m!FZ5o|+a%n#X6`0   从本质上讲,Asp.Net 主要是由一系列的类组成,这些类的主要目的就是将Http请求转变为对客户端的响应。HttpRuntime类是Asp.Net的一个主要入口,它有一个称作 ProcessRequest 的方法,这个方法以一个 HttpWorkerRequest 类作为参数。HttpRuntime 类几乎包含着关于单个 Http请求的所有信息:所请求的文件、服务器端变量、QueryString、Http头信息等等。Asp.Net 使用这些信息来加载、运行正确的文件,并且将这个请求转换到输出流中,一般来说,也就是HTML页面。
q ].e{%X)[ H_(]0NOTE:也可以是张图片。 
i0aK0Z lufb-Va051Testing软件测试网C9|z-nV#iz
当 Web.config文件的内容发生改变或者 .aspx文件发生变动的时候,为了能够卸载运行在同一个进程中的应用程序(NOTE:卸载也是为了重新加载),Http请求被分放在相互隔离的应用程序域中。51Testing软件测试网 Ch9y b"G H;Z ml
NOTE:可能你以前就听过应用程序域,但是不了解怎么回事,应用程序域就是 AppDomain。51Testing软件测试网Tk y1~!@oa

51Testing软件测试网4V-th0tL.{$] {A;rc

对于IIS来说,它依赖一个叫做 HTTP.SYS 的内置驱动程序来监听来自外部的 HTTP请求。在操作系统启动的时候,IIS首先在HTTP.SYS中注册自己的虚拟路径。
yglzG+e(z+q9d0NOTE:实际上相当于告诉HTTP.SYS哪些URL是可以访问的,哪些是不可以访问的。举个简单的例子:为什么你访问不存在的文件会出现 404 错误呢?就是在这一步确定的。

U'e\I`,U{ d+F051Testing软件测试网*zP,YF~_PI~/_

如果请求的是一个可访问的URL,HTTP.SYS会将这个请求交给 IIS 工作者进程。
5b%[L D6_ E0NOTE:IIS6.0中叫做 w3wp.exe,IIS5.0中叫做 aspnet_wp.exe。51Testing软件测试网Vc/n/v]2m

51Testing软件测试网-@'k7F'tZ n1c3_

每个工作者进程都有一个身份标识以及一系列的可选性能参数。51Testing软件测试网QY^/W+]]%VOTz;}
NOTE:可选性能参数,是指诸如回收机制的设置、超时时间设置 等等。51Testing软件测试网#d]fL}b'g

51Testing软件测试网M.zhd0S:w$v

接下来进行的事情就是上面讲述的ISAPI了。51Testing软件测试网b YP Q'yC

51Testing软件测试网#Fl/OJzI

除了映射文件与其对应的处理程序以外,ISAPI 还需要做一些其他的工作:

2Y5JOc+q%B|N&B0

5G7Pf-UH,a}({jc01、HTTP.SYS中获取当前的Http请求信息,并且将这些信息保存到 HttpWorkerRequest 类中。

a:ZgVw;D;l0

*pN x'u[5Qiv#tn$@02、在相互隔离的应用程序域AppDomain中加载HttpRuntime。

N7u3Ly^Hk0

:SnZ1E E`*O/\*]03、调用 HttpRuntime的ProcessRequest方法。

w F;Rz1l{nB0

7D`oX&w5ypXw0接下来才是程序员通常编写的代码所完成的工作了,然后,IIS 接收返回的数据流,并重新返还给 HTTP.SYS,最后,HTTP.SYS 再将这些数据返回给客户端浏览器。51Testing软件测试网(P` dz7M4m8?w
51Testing软件测试网$\ `z3wMsl7w

51Testing软件测试网u4Xcu xuv

图3.Asp.Net 的宿主环境
Ot~Vfh[1F)N051Testing软件测试网[t,?.W,k

a0YL GH0理解管道(Pipeline)

|.HFt8z"p C051Testing软件测试网Ar3lkCQ3t%V+Gn

在前面中,我们在一个相对比较低的层次上讨论了从发出Http请求到看到浏览器输出这转瞬即逝的十分之一秒内IIS和 Framework 所做的事情。但是我们忽略了一个细节:程序员编写的代码是如何在这一过程中衔接的,本章我们就来看看这个问题。

's iZ2M9H1A0

A9f%@xtl{?0当Http请求进入 Asp.Net Runtime以后,它的管道由托管模块(NOTE:Managed Modules)和处理程序(NOTE:Handlers)组成,并且由管道来处理这个 Http请求。51Testing软件测试网&X&T0\ H&wu L

AI0W i l2WN!S*f051Testing软件测试网d7RmB&WsE

51Testing软件测试网Q q @+n$w } S.N!_@;n

图4. 理解 Http 管道
X3X,yS7z-CA&\ j(^051Testing软件测试网.I baaxgV'S |
51Testing软件测试网*zLn7Xr!f
我们按编号来看一下这幅图中的数据是如何流动的。51Testing软件测试网xO9AMeT

51Testing软件测试网0OG%u R_B@N

%g?wA&Tlj5y#o#L#F01. HttpRuntime将Http请求转交给 HttpApplication,HttpApplication代表着程序员创建的Web应用程序。HttpApplication创建针对此Http请求的 HttpContext对象,这些对象包含了关于此请求的诸多其他对象,主要是HttpRequest、HttpResponse、HttpSessionState等。这些对象在程序中可以通过Page类或者Context类进行访问。

o6T9`gH*IP i}n0

uen@r3D hFu02. 接下来Http请求通过一系列Module,这些Module对Http请求具有完全的控制权。这些Module可以做一些执行某个实际工作前的事情。

D1P^O ja1@Md;d2M051Testing软件测试网.f6aG)_EI~^.Q

3. Http请求经过所有的Module之后,它会被HttpHandler处理。在这一步,执行实际的一些操作,通常也就是.aspx页面所完成的业务逻辑。可能你会觉得在创建.aspx页面并没有体会到这一过程,但是,你一定知道,.aspx 页面继承自Page类,我们看一下Page类的签名:

h*V |'f?/ko{`!`0

Sk.F N&p s es0public class Page : TemplateControl, IHttpHandler{51Testing软件测试网J _5U2Ug9H
    // 代码省略
(d$?%M-ei8x1nL0}

DNBpD,kX9i051Testing软件测试网9gFu NE@F

可以看到,Page类实现了IHttpHandler接口,HttpHandler也是Http请求处理的最底层。51Testing软件测试网-Xq c%Bq;kFN \E*_9o
51Testing软件测试网5bv g g B#e#T)b pR?

51Testing软件测试网dS0XH6BZ5A

4.HttpHandler处理完以后,Http请求再一次回到Module,此时Module可以做一些某个工作已经完成了之后的事情。51Testing软件测试网a.q^:VU
    NOTE:注意用红色标识的字,然后回想一下:Asp.Net 中是不是有众多的 Inserting 、Inserted 之类成对的事件?其实,这里讲述的就是为什么Asp.Net可以将一个Insert操作分成前后两部分,然后再分别进行事件拦截的幕后原理。51Testing软件测试网/| US7b+GW@#LJ

w.FC:o_ T2j0

TAG: http IIS HTTPHandler ISAPI Web测试

毒菇小妖的窝 引用 删除 ireneyao   /   2008-07-02 22:50:46
谢谢^_^
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar