ASP.NET Web编程原理 之
IIS架构与HTTP请求处理流程(3)
(
续前文
)
8.1.4 HTTP请求的处理过程
在了解了 IIS 的架构之后,来看一下 IIS 架构中的各个组成部分是如何相互配合处理 HTTP 请求的。
先来从总体上看看 HTTP 请求的处理过程( 图 8 ‑ 10 )。
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1028" style="width: 415.5pt; height: 180pt;" o:ole="" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CUsers%5CJINXUL%7E1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image001.emz"></imagedata></shape> 图 8 ‑ 10 HTTP 请求的处理过程
图 8 ‑ 10 清晰地展示出了 HTTP 请求处理就是浏览器与 Web 服务器间“一问一答”的过程 。
首先,浏览器尝试连接 Web 服务器的 80 端口,如果 Web 服务器可以响应此连接请求,就在浏览器与 Web 服务器间建立了一个通讯链路,在此“通道”上浏览器与 Web 服务器可以相互发送与接收信息。
假设浏览器向 Web 服务器发出一个读取某 ASP.NET 站点上的某个 ASPX 网页的请求。当此请求通过网络到达 Web 服务器时,此请求被 HTTP.SYS 组件所接收。 HTTP.SYS 系统组件会检查此 HTTP 请求的相关信息,根据其 URL 将此 HTTP 请求发送给运行在某个应用程序池中的工作者进程处理。如果同时有多个针对此 ASP.NET 站点的 HTTP 请求, HTTP.SYS 会将这些请求排队,加入到对应的应用程序池的 HTTP 请求队列中等待。
如果这是第一个对 ASP.NET 站点的 HTTP 请求,工作者进程会加载 aspnet_isapi.dll ,并将请求转给它, aspnet_isapi.dll 接着会装载 .NET CLR [1] , 创建一个针对此 ASP.NET 站点的应用程序域 [2] ,然后启动一个复杂的由多个步骤和组件参与的处理流程,当此处理流程结束,要发回给客户端的结果(通常是 HTML 代码,当然也可以是其他类型的资源,比如由程序动态生成的图片)已经生成,此结果被转发给 HTTP.SYS 。
注意: 对于以集成模式运行的 IIS 7 , .NET CLR 在应用程序池一启动就自动装载,从而避免了临时装载 CLR 的花销。后继处理过程与 IIS 6 基本一致。
HTTP.SYS 接收到请求的处理结果之后,将其缓存到缓冲区中,然后把处理结果发回给发出 HTTP 请求的浏览器。
上述过程是对 IIS 处理 HTTP 请求全过程的粗略描述。 8.2 节将选取这个处理过程中的主要阶段,详细介绍针对 ASP.NET 网页的 HTTP 请求处理过程。
8.1.5 ISAPI扩展、ISAPI筛选器和程序映射
在 IIS 的文档中经常会提到两个术语: ISAPI 扩展和 ISAPI 筛选器。
1 ISAPI 扩展
“ ISAPI 扩展( ISAPI Extension ) ”是一种可以添加到 IIS 中以增强 Web 服务器功能的程序,其载体为 DLL 文件。它通常直接负责响应 HTTP 请求。
根据 HTTP 请求要访问的资源扩展名(通过 URL 获取), IIS 会选取特定的 ISAPI 扩展来处理这一请求,这一过程被称为“ 程序映射 ” 。 而用于响应 HTTP 请求的这一 ISAPI 扩展被称为“ HTTP Handler ( HTTP 处理程序) ”。 图 8 ‑ 11 展示了 IIS 6 中的程序映射。
<shape id="图片_x0020_8" style="visibility: visible; width: 301.5pt; height: 329.25pt;" type="#_x0000_t75" alt="IIS2" o:spid="_x0000_i1025"><imagedata o:title="IIS2" src="file:///C:%5CUsers%5CJINXUL%7E1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image002.jpg"><font size="3" color="#000000"></font></imagedata></shape>
图 8 ‑ 11 程序映射( IIS 6 )
在 图 8 ‑ 11 中可以看到, IIS 指定对 ASP.NET 网页(其扩展名为 .aspx )的请求将由 aspnet_isapi.dll 处理( 图 8 ‑ 12 )。
<shape id="图片_x0020_9" style="visibility: visible; width: 302.25pt; height: 170.25pt;" type="#_x0000_t75" alt="无标题" o:spid="_x0000_i1026"><imagedata o:title="无标题" src="file:///C:%5CUsers%5CJINXUL%7E1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image003.png"><font size="3" color="#000000"></font></imagedata></shape>
图 8 ‑ 12 aspnet_isapi.dll 负责处理对 ASP.NET 网页的请求
IIS 7 中的程序映射与 IIS 6 略有不同。当 IIS 7 以“经典模式”运行时,与 IIS 6 一样使用 aspnet_isapi.dll 响应针对“ .aspx ”的请求。但当 IIS 7 以“集成模式”运行时,则使用托管处理程序( System.Web.UI.PageHandlerFactory )响应针对“ .aspx ”的请求( 图 8 ‑ 13 )。
<shape id="图片_x0020_4" style="visibility: visible; width: 248.25pt; height: 221.25pt;" type="#_x0000_t75" o:spid="_x0000_i1027"><imagedata o:title="" src="file:///C:%5CUsers%5CJINXUL%7E1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image004.png"><font size="3" color="#000000"></font></imagedata></shape>
图 8 ‑ 13 IIS 7 集成模式下的程序映射
2 ISAPI 筛选器
“ISAPI筛选器( ISAPI Filter ) ” 也是一种 DLL ,但它不负责生成 HTTP 请求,它的主要作用是响应某些特定的事件。当这些事件发生时 ISAPI 筛选器被调用,它可以修改传入或传出的 HTTP 数据。
在 IIS 7 中,使用“ HTTP 模块( HTTP Module ) ” 取代了传统 ISAPI 筛选器的功能。
注意: ISAPI 扩展与 ISAPI 筛选器名字很相近,但其在 IIS 中的地位和所起的作用是不同的。
[1] CLR ( Comon Language Runtime ):通用语言运行时,是 .NET 的核心,可以将其看成是一台虚拟的专用于运行 .NET 程序的计算机。
[2] 应用程序域( Application Domain ): .NET 引入的一种代码隔离机制,一个托管进程可以拥有多个应用程序域,在应用程序域中可以装载程序集,创建特定类型的对象,调用对象的方法。
*********************************************************
下一部分,将在本部分所介绍内容的基础上,详细介绍与ASP.NET开发密切相关的“ASP.NET请求处理管线(HTTP Pipe Line)”