转自:http://www.hndxc.net/show.aspx?id=69275&cid=125
首先我们要弄清楚两个非常重要的概念:
1, worker process(w3wp.exe). worker process管理所有的来自客户端的请求并给出响应。它是IIS下asp.net 应用程序的核心。
2, application pool. 不同的appPool对应不同的worker process,IIS5及之前的IIS版本均没有application pool的概念。每一个application pool对应着一个worker process,在IIS Metabase中维护着Application Pool和worker process的Mapping。这就避免了IIS5中出现的worker process(IIS5中是aspnet_wp.exe,同一时间只能运行一个该进程)崩溃,application全崩溃的局面。
客户端向IIS发出一个资源请求后发生了如下事情:
1, server接受该请求
IIS6通过内核模式(Kernel mode)中的HTTP.SYS来分发各个Request到application pool。 这并不是随机的过程,在application pool创建的时候就已经注册到了HTTP.SYS,所以当请求来到时HTTP.SYS会直接发送到相应的application pool。 接下来在IIS的用户模式(User mode)中,Web Admin Services (WAS) 做了从HTTP.SYS中得到Request并分发到application pool的工作。application pool直接把request传递给worker process。
2, 请求传递到worker process后,worker process初始化加载ASP.NET ISAPI(Internet Server Application Program Interface),ASP.NET ISAPI进而加载CLR创建托管环境。
(注:ISAPI只是一个接口,起到一个代理的作用,主要能力就是根据Request URL的后缀来寻找该后缀的处理程序)
ASP.NET ISAPI定义在aspnet_isapi.dll中,它本身运行在一个非托管的环境中。ASP.NET ISAPI开始一个HttpRuntime, HttpRuntime调用ProcessRequest方法来开始处理请求。ProcessRequest根据ISAPI传进来的iWRType 来创建不同的HttpWorkerRequest,从而屏蔽了不同IIS的差异。接下来ProcessRequest方法创建了HttpContext,我们使用HTTPContext.Current来访问它。在HttpRuntime使用HttpApplicationFactory创建了HttpApplication对象(IHttpHandler)以后,所有的请求都会在通过httpmodule后找到相应的Httphandler进行处理。在HttpApplicationFactory创建HttpApplication之前,会查找config(web.config和Machine.config)文件中注册的所有的HttpModule,并根据配置信息加载相应的Assembly,通过Reflection创建对应的HttpModule,并将这些Module加到HttpApplication 的_moduleCollection Filed中。我们对一个Application的请求最终会落到一个HttpApplication对象上。当一个请求到来时,ASP.NET会在Httplication Pool中查找未被使用的HttpApplication对象。
3, 请求通过HTTP管道后,每个请求都发向相关的各自的httphandler,IIS请求处理过程结束。
HttpHandler是HTTP管道的终点,它为每个request生成输出。System .Web.UI.Page就是这样一个典型的Httphandler,当我们请求一个aspx页面,这个HttpHandler就生成html发送回客户端。看Page类的签名:
public class Page : TemplateControl, IHttpHandler
{
}
可以看到,Page类就是一个HttpHandler。
综上整个过程就是:当客户端向服务器发送资源请求时,请求首先到达IIS的HTTP.SYS。然后HTTP.SYS发送请求道对应的Application Pool。 然后Application Pool发送请求到Worker Process(W3WP.exe)中加载ISAPI Extension,ISAPI创建一个HttpRuntime对象来通过HttpModule和HttpHandler处理请求。 然后页面生命周期就开始了。
4, 页面生命周期开始
页面生命周期的主要阶段包括:
页面初始化(Init): 服务器创建服务器控件的实例
加载(load): 控件实例被加载到它定义的页面对象中
预输出:(PreRender) 对控件的更改被更新,准备输出。
保存(SaveViewState): 控件的状态信息被保存。
输出页面(Render):服务器为控件创建html标记。
处理(Dispose): 主要做的工作就是dispose, 关闭数据库连接,文件资源的释放等。
卸载(Unload):销毁服务器控件的实例
页面生命周期的主要事件:
PreInit:
1.检查IsPostBack 属性
2.动态设置Master Page
3.动态设置Theme
4.设置控件的默认值(UniqueId等)
5.重新创建动态控件(初始化控件),初始化控件的值
Init: 这个事件发生在所有的控件被初始化,所有的皮肤设置被应用以后。它用来读取或者初始化控件属性。它能够用来注册一些aspx页面中没有指出的控件的事件。
InitComplete: Use this event for processing tasks that require all initialization to be complete.
PreLoad: 加载页面的ViewState和所有的控件,然后处理所有的包含在Request实例中的postback数据。
Load: 这个事件可能是大家最熟悉的了。需要注意的是,Page对象会递归的调用子控件的onload事件直到页面和所有的子控件被加载完成。这个事件主要用来设置控件属性的值,建立数据库连接(通常不这么做)。
Control events: 这个就不多说了,主要是处理控件的事件,例如click。这也就让我们明白了每次我们click一个Button的时候,实际上是要先去执行load事件然后才执行click事件的,一般我们用!IsPostBack来判断一下从而避免执行不必要的加载逻辑。
LoadComplete: 页面所有的控件都被加载以后执行,暂时没有想到用来干什么。。。
PreRender: 在HTML被生成之前这是最后一个事件。每一个页面中的控件都有PreRender的过程。在这里对将要输出的HTML结果进行最后一次修改。
SaveStateComplete: 在这个时间发生之前,已经保存了所有控件和页面的,任何对page或者控件的改动都不会产生左右。暂时没想到用来干啥。
Render: 它不是一个事件而是一个方法。工作就是把HTML写回客户端浏览器。
UnLoad: 页面中的每一个控件都会发生这件事。在控件中,使用这个事件来做清理工作,例如关闭数据库连接等。对与页面本身也是做清理工作,例如关闭打开的文件和数据库连接,或者结束日志或者其它指定的工作。
需要说明的是,每次Request都会创建一个全新的Page类的实例,所以在页面中的自己定义的字段是不能在两次request中传递值的,需要使用viewstate来存储。
5, HttpHandler根据页面生命周期中事件的处理把结果发回IIS,IIS再把结果发回客户端浏览器。
值得注意的是,在这个过程中请求会再次通过HttpModule(注册一个EndRequest事件)。
至此,整个Request结束。
相关推荐
在Windows 7操作系统中配置IIS(Internet Information Services)与ASP.NET并发布网站是一个涉及到多个步骤的过程。以下是一个详尽的指南,旨在帮助你完成这一系列配置。 首先,你需要安装IIS。这可以通过控制面板...
此操作会将 .NET 扩展名映射(如 .aspx 和 .asmx 文件)注册到 IIS 中,使 IIS 能够识别并处理 ASP.NET 请求。 #### 二、配置 Machine.config 文件 1. **定位 Machine.config 文件**:此文件位于 `%SystemRoot%\...
##### IIS6的ASP.NET请求处理过程 IIS6引入了一个新组件http.sys,用于在KernelMode下接收和分发HTTP请求,提高了处理速度和安全性。 - **请求处理流程**:当http.sys接收到aspx格式的HTTP请求,它会查询IIS的元...
本文将深入探讨ASP.NET请求处理的机制,包括内核模式和用户模式的理解,以及请求从接收到响应的整个流程。 1. **内核模式与用户模式** 在Windows Server操作系统中,进程有两种运行模式:内核模式和用户模式。内核...
1. **ASP.NET页面生命周期**:理解ASP.NET页面从请求到响应的完整生命周期至关重要,包括初始化、加载、验证、呈现和卸载等阶段。开发者需要了解何时添加和修改控件属性,以及如何处理回发数据。 2. **控件和事件...
IIS7.0 的集成管道模型为 ASP.NET 应用程序带来了显著的好处,包括统一的请求处理、灵活的模块管理和改进的事件触发机制。通过理解这些核心概念,开发者可以更好地设计和优化自己的 ASP.NET 应用程序,以满足不断...
注册过程中,aspnet_regiis.exe会向IIS添加一个名为aspnet_isapi.dll的ISAPI扩展,这个扩展是处理所有ASP.NET请求的核心组件。 2. **设置应用程序池**:ASP.NET应用通常运行在IIS的应用程序池中,注册过程中会创建或...
此外,执行`aspnet_regiis.exe -iru`命令可以帮助重新注册ASP.NET ISAPI过滤器和脚本映射,确保它们与当前的.NET Framework版本一致。 总的来说,配置IIS以运行.NET4.0并解析ASPX文件涉及多个步骤,包括但不限于...
【ASP.NET技术详解】 ASP.NET是由微软公司推出的服务器端Web应用程序框架,用于构建动态网站、Web应用程序和Web服务。在本“基于ASP.NET的图书销售系统”中,开发者使用了Visual Studio 2005这一集成开发环境进行...
- **ASP.NET集成**:IIS 7.5与.NET Framework紧密集成,支持ASP.NET应用程序的部署和运行。这使得开发者可以利用.NET的强大功能开发动态网站和Web应用。 - **FastCGI支持**:IIS 7.5 支持FastCGI,能更好地运行PHP...
4. **ASP.NET页面生命周期**:理解页面从请求到响应的过程,包括初始化、加载、回发、验证和卸载阶段。 5. **状态管理**:掌握如何在ASP.NET中管理用户状态,如View State、Session State、Cookie和Query String。 ...
2. **ASP.NET页面生命周期**:详细解释了ASP.NET页面从请求到响应的整个生命周期,包括初始化、加载、回发和卸载等各个阶段,以及如何在这期间处理用户输入和控制状态。 3. **控件与事件处理**:讲解了ASP.NET的...
最后,了解如何将项目部署到IIS服务器上,使其可供互联网访问,是ASP.NET开发过程中的重要环节。 这个ASP.NET BBS课程设计项目提供了一个学习和实践ASP.NET Web Forms、数据库操作、前端交互等技能的实例。通过...
#### ASP.NET请求处理流程 当IIS遇到无法直接处理的请求,如.aspx或.cshtml文件时,它会将请求转交给.NET Framework。接下来,我们将详细探讨这个过程: 1. **初始化阶段**:当服务器启动时,ASP.NET会加载必要的...
页面生命周期是指ASP.NET页面从请求到响应的整个过程,包括初始化、加载、验证、呈现和卸载等阶段。控件事件处理是ASP.NET中非常重要的部分,通过编写事件处理程序,可以实现用户交互。数据绑定则允许将数据源(如...
【ASP.NET 应用实例详解】 ASP.NET 是微软公司推出的一种用于构建动态网站、Web 应用程序和服务的开发框架。它基于.NET Framework,提供了一种高效、安全且可扩展的方式来构建 Web 解决方案。本篇文章将深入探讨 ...
ASP.NET 2.0的运行原理涉及复杂的组件协作和请求处理流程。从HTTP请求到达IIS,到最终页面呈现给用户,每一步都由精心设计的组件完成特定任务。了解这些核心组件的工作机制和流程,对于优化ASP.NET应用程序性能、...
本资料集《Asp.Net各章典型例题程序详解》深入剖析了Asp.Net的各个关键知识点,并通过具体的代码示例进行解析,帮助学习者更好地理解和掌握Asp.Net技术。 1. **Asp.Net基础** - **网页生命周期**:Asp.Net页面从...