发布时间:2007年5月2日
通过:
在这一系列文章中,我要去处理,并描述一个Web请求的生命周期的早期阶段,其生命,当它接受由Web服务器,通过其处理到ASP.NET管道一代管道的端点的响应。
介绍
微软的Active Server Pages的,也被称为ASP
,因为它的第一个版本在1996年年底提供的Web开发人员提供了一个丰富 而复杂的框架用于构建Web应用程序。随着时间的流逝,其基础设施的发展和完善,以至于现在被称为ASP.NET
已不再是类似于其前身。 ASP.NET
是一个框架,用于构建Web应用程序,也就是在Web上运行的应用程序,客户端-服务器范例表示主要是在浏览器的不同种类的资源,到Web服务器转发请求。CGI
,PHP
,JSP
和ASP
等服务器端资源的动态生成技术问世之前 ,所有Web服务器必须做的是接受客户的静态资源的请求,并将其转发给请求者。当动态技术开始成长起来的Web服务器成为投资承担更大的责任,因为他们不得不找到一种方法来生成那些站在他们一边的动态资源并将结果返回到客户端,他们以前没有建任务。
从鸟的眼睛视图,客户端和服务器之间的交互是非常简单的。在网上发生的通信,应用水平依赖于TCP协议通过HTTP
(超文本传输协议)和IP传输两个节点之间的数据连接到异构网络被称为万维网。
每个动态服务 器端技术基本上斜靠在一个特定的Web服务器实现, ASP.NET
是微软的Internet信息服务器,又名IIS
紧密结合。
不同的服务器上选择了不同的方式来生成和动态资源,就是我们要研究的是如何IIS
一起请求的路径,如下一次在服务器上,并返回给客户端的服务。
IIS和ISAPI扩展
如前所述,静态资源不需要由服务器处理的,一次这样的资源的请求到达时,服务器从文件系统中检索它的内容,并将其发送回给客户端,作为字节流的流动上的HTTP
协议。静态资源可以是图像,JavaScript文件,CSS样式表或普通的HTML页面。很显然,服务器需要知道如何区分静态和动态的资源,而第二个需要以某种方式处理,而不是仅仅发送回客户端。这就是出现ISAPI
扩展,ISAPI
代表的互联网服务器应用程序编程接口ISAPI
扩展模块实现普通的老式的Win32 DLL,IIS
依靠处理特定资源。ISAPI
扩展和文件之间的映射配置通过IIS
管理单元和存储在IIS
元数据库中,每一个文件的扩展名可以与一个特定的ISAPI
扩展,也就是说,对此类文件的请求到达时,IIS
处理相应的ISAPI
扩展,有信心,这将是能够处理它。
图1:在IIS 5.0上配置ISAPI扩展映射
ISAPI
扩展显然需要尊重一个共同的接口,通过它们可以被称为IIS
提供了必要的数据来阐述请求并生成响应。
如图1所示,asp扩展映射到asp.dll的
ISAPI
扩展,这个组件的ASP
的时间是在负责执行所需的全部任务,就是收集有关请求的信息,生成响应到ASP
页面通过请求,响应和其他常见的ASP
内在对象,解析和执行的 ASP
页面,并返回生成的HTML。
其实,这是一个很大的改进的技术,如CGI相比,但ASP.NET
采用这种方法能更进一步,并引入抽象,完全屏蔽了开发人员不必关心在这个阶段会发生什么。
安装时,ASP.NET
配置IIS
,ASP.NET
特定文件的请求重定向 到一个新的ISAPI
扩展名为aspnet_isapi.dll的
。这扩展是有点不同,那么前asp.dll的
扩展,这是基本上只是负责分析和执行请求的ASP
页面。一个通用的ISAPI
模块处理请求而采取的步骤是完全隐藏IIS
,因此 ISAPI
扩展,可以按照不同的范式,以处理请求。
表1:IIS应用程序映射为aspnet_isapi.dll的
延期 | 资源类型 |
ASAX。 | ASP.NET应用程序文件。通常的Global.asax。 |
的。ascx | ASP.NET用户控制文件。 |
ashx的。 | HTTP处理程序,ISAPI扩展的管理对口。 |
asmx的。 | ASP.NET Web服务。 |
的。aspx | ASP.NET网页。 |
AXD。 | ASP.NET内部HTTP处理程序。 |
表1中列出的文件扩展名,ASP.NET
ISAPI
扩展管理其他文件扩展名通常不提供网页浏览器,如Visual Studio项目文件,源代码文件和配置文件,例如。
ASP.NET进程模型
到目前为止,我们已经看到,当请求一个ASP.NET
文件拾起 IIS
,它被传递给aspnet_isapi.dll的
,这是ASP.NET
相关处理的主入口点 。其实,ISAPI
扩展确实理智取决于IIS
系统上可用的版本,并可能会有很大的过程模型,它是由ASP.NET
运行时执行的操作来处理请求并生成响应的顺序,一点点。
IIS
5.X 下运行时,所有的ASP.NET相关的请求派出的 ISAPI
扩展名为aspnet_wp.exe的
外部工作进程。 ASP.NET
ISAPI
扩展的IIS
进程 inetinfo.exe的
主持,通过控制aspnet_wp.exe的
,连同所有有关的信息传入的请求。两者之间的通信是通过命名管道,一个众所周知的IPC(进程间通信)机制。ASP.NET
工作进程进行了相当数量的任务,与ISAPI
扩展。他们的ASP.NET
请求的抽油烟机下发生的所有的东西,是主要作者。介绍将在后面讨论的一个话题,请注意一个事实,每一个web应用程序,IIS
托管在不同的虚拟目录,对应 的上下文中执行相同的过程中,ASP.NET
工作进程。为了提供隔离和抽象从执行上下文ASP.NET
模型引入了应用程序域的概念,在简短的AppDomain。它们可以被认为是轻量进程。在此以后。
的另一边,如果运行在IIS
6下,aspnet_wp.exe的
过程中不使用,在向另一个进程名为w3wp.exe的
。此外,inetinfo.exe的
不再使用的HTTP
请求转发到ISAPI
扩展,虽然它一直运行其他协议请求服务。使用以前版本的IIS
进程模型相比很多其他细节变化,虽然IIS
6能够在兼容模式下运行,其前身效仿行为。水平较低-内核- 前进了一大步,比IIS
5 上运行时,使用的过程模型 ,前者处理传入的请求,然后转发到正确的ISAPI
扩展,从而避免了进程间通信技术这可能代表一个昂贵的操作下的性能和资源消耗的角度来看。在下面的段落中,我们将深入到这个话题。
IIS 5.0进程模型
这是默认的进程模型,可在Windows 2000和XP机器。正如前面提到的,包括在默认情况下,IIS
inetinfo.exe的
进程听传入的HTTP
请求到一个单一的队列和排队,等待被处理的TCP端口上80 。如果请求是特定于ASP.NET
,处理委托给ASP.NET
ISAPI
扩展aspnet_isapi.dll的
。这反过来,通信与ASP.NET
辅助进程aspnet_wp.exe的
通过命名管道,最后是负责的工作进程提供ASP.NET
HTTP
运行时环境的要求。这个过程是在图2中以图形方式表示。
图2:IIS 5.0进程模型
在图2中表示一个额外的元素,我们没有提到的是,ASP.NET
HTTP
运行时环境。这不是这篇文章的主题,并在后续的文章,但为了讨论HTTP
运行时环境,可以看作是一个黑盒子,所有的ASP.NET
特定的处理发生,所有的托管代码最终会被解释生命和开发商其实可以把他们的手,谁最终将处理请求并生成响应的HttpHandler的httpRuntime直。这甚至被称为为ASP.NET
管道或HTTP
运行时管道。
这个过程模型的一个有趣的点是,所有的请求,一旦所处理的 ISAPI
扩展,传递给ASP.NET
工作进程。这个过程中只有一个实例是活跃在同一时间,但有一个例外,稍后讨论。因此,所有的ASP.NET
Web应用程序托管在IIS
实际上是托管工作进程里面,太。然而,这并不意味着,所有的应用程序都运行在相同的情况下,并分享他们的所有数据。如前所述, ASP.NET
介绍AppDomain中的概念,它本质上是一种管理的轻量级进程提供隔离和安全边界。每个IIS
虚拟目录的执行,这是自动加载到工作进程时,属于该应用程序的资源请求第一次在一个单一的AppDomain。一旦在AppDomain加载-也就是说,需要满足该请求的所有程序集加载到AppDomain中-控制实际上是传递给 ASP.NET
管道的实际处理。因此,多个AppDomain可以运行在同一个进程中,由多个线程同时请求相同的AppDomain可以送达。然而,一个线程不属于一个AppDomain,可以起到不同的AppDomain的请求,但在一个给定的时间内,一个线程属于一个单一的AppDomain。
就性能而言,可以回收工作进程,根据一些标准,可以指定在machine.config文件放置在目录C:\ WINDOWS \ microsoft.net \框架\ [框架版本] \ CONFIG声明。这些标准是年龄的过程中,服务请求和排队数量,花费的时间空闲和消耗的内存。一旦达到这些参数阈值,ISAPI
扩展创建一个新的工作进程,我们将从此使用服务请求的实例。这是唯一的时候,可以同时运行多个副本的过程。事实上,旧的流程实例没有死亡,但它允许终止挂起的请求提供服务。
IIS 6.0进程型号“
IIS
6进程模型的机器上运行的是Windows 2003 Server操作系统是默认的模型。它引入了一些变化和改进,在IIS
5的过程模型。最大的变化之一是应用程序池的概念。在IIS
5.X所有Web应用程序,那就是所有AppDomain,被托管的ASP.NET
工作进程。达到更精细的粒度通过安全边界和个性化,在IIS
6进程模型允许应用程序内运行新的工作进程,w3wp.exe的
不同副本。每个应用程序池可以包含多个AppDomain和托管工作进程的一个副本。换句话说,这种转变是从一个单一的过程,所有的应用程序托管托管每一个应用程序池的多个进程。这种模式也称为工作进程隔离模式。
从以前的模型的另一个大的变化是IIS
侦听传入请求的方式。IIS
5的模型,这是IIS
进程,inetinfo.exe的
,谁是在一个特定的TCP端口监听HTTP
请求。在IIS
6架构,处理传入的请求,并通过名为HTTP.SYS的内核驱动程序在内核级别,而不是用户模式排队,这种方法有几个优点旧的模式,被称为内核级别的请求排队。
图3:IIS 6.0进程模型
图3示出部分中的请求的处理时,使用的II 6模型的主要组成部分。一旦请求到达内核级别的设备驱动程序HTTP.SYS将其路由到正确的应用程序池队列。每个队列属于一个特定的应用程序池,从而达到一个特定的工作进程,下次收到请求从队列副本。这种方法的高度降低了使用命名管道没有进程间通信正在发生在IIS
5型自引入的开销,但要求为首的工作进程,直接从内核级别的驱动程序。关于可靠性也具有许多优点。由于在内核模式下运行,请求调度不会受到用户级别,就是在工作进程崩溃和故障happing。因此,即使工作进程崩溃,系统仍然能够接受传入的请求,并最终重新启动崩溃的过程。
它的工作过程是谁在负责加载ASP.NET
ISAPI
扩展,这反过来,HTTP
运行时加载的CRL和所有的工作委托。
w3wp.exe的
工作进程,aspnet_wp.exe的
过程中使用IIS
5型不同,是不是特定于ASP.NET
,并用于处理任何请求。具体的工作进程,然后决定哪些的ISAPI
模块加载根据资源的类型,它需要服务。
图3为简单起见不强调一个细节是通过加载一个模块在IIS
6中被称为Web管理服务(WAS)传入的请求从应用程序池队列转发到合适的工作进程。此模块是负责读取工作进程-从IIS
元数据库和Web应用程序绑定,将请求转发给正确的工作进程。
参考文献
- 西蒙娜Busoli - ASP.NET塔内- ISAPI和应用程序域之间的桥梁
- BrainBell.com - ASP.NET应用程序基础
- 迪诺埃斯波西托- 微软ASP.NET 2.0核心编程参考
- 迪诺埃斯波西托- 编程微软ASP.NET 2.0应用程序的高级主题
- 乔治·谢泼德- IIS 6.0的新特性:提高你的Web服务器的性能,可靠性和可扩展性
- 弗里茨洋葱- ASP.NET管道:使用线程和生成异步处理程序在你的服务器端Web代码
- 蒂姆·埃瓦尔德和基思布朗的- HTTP管道安全地执行要求处理,过滤,内容重定向在ASP.NET HTTP管道