IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述
本主题概述 ASP.NET 应用程序的生命周期,列出了重要的生命周期事件,并描述了您编写的代码将如何适应于应用程序生命周期。本主题中的信息适用于 IIS 5.0 和 IIS 6.0。有关 IIS 7.0 中的 ASP.NET 应用程序生命周期的信息,请参见 IIS 7.0 的 ASP.NET 应用程序生命周期概述。
在 ASP.NET 中,若要对 ASP.NET 应用程序进行初始化并使它处理请求,必须执行一些处理步骤。 此外,ASP.NET 只是对浏览器发出的请求进行处理的 Web 服务器结构的一部分。 了解应用程序生命周期非常重要,这样才能在适当的生命周期阶段编写代码,达到预期的效果。
下表描述了 ASP.NET 应用程序生命周期的各个阶段。
|
阶段 |
说明 |
|---|---|
|
用户从 Web 服务器请求应用程序资源。 |
ASP.NET 应用程序的生命周期以浏览器向 Web 服务器(对于 ASP.NET 应用程序,通常为 IIS)发送请求为起点。 ASP.NET 是 Web 服务器下的 ISAPI 扩展。Web 服务器接收到请求时,会对所请求的文件的文件扩展名进行检查,确定应由哪个 ISAPI 扩展处理该请求,然后将该请求传递给合适的 ISAPI 扩展。 ASP.NET 处理已映射到其上的文件扩展名,如 .aspx、.ascx、.ashx 和 .asmx。 说明:如 果文件扩展名尚未映射到 ASP.NET,则 ASP.NET 将不会接收该请求。 对于使用 ASP.NET 身份验证的应用程序,理解这一点非常重要。 例如,由于 .htm 文件通常没有映射到 ASP.NET,因此 ASP.NET 将不会对 .htm 文件请求执行身份验证或授权检查。 因此,即使文件仅包含静态内容,如果希望 ASP.NET 检查身份验证,也应使用映射到 ASP.NET 的文件扩展名创建该文件,如采用文件扩展名 .aspx。
说明:如果要创建服务于特定文件扩展名的自定义处理程序,必须在 IIS 中将该扩展名映射到 ASP.NET,还必须在应用程序的 Web.config 文件中注册该处理程序。有关更多信息,请参见 HTTP 处理程序和 HTTP 模块概述。
|
|
ASP.NET 接收对应用程序的第一个请求。 |
当 ASP.NET 接收到对应用程序中任何资源的第一个请求时,名为 ApplicationManager 的类会创建一个应用程序域。 应用程序域为全局变量提供应用程序隔离,并允许单独卸载每个应用程序。 在应用程序域中,将为名为 HostingEnvironment 的类创建一个实例,该实例提供对有关应用程序的信息(如存储该应用程序的文件夹的名称)的访问。 下面的关系图说明了这种关系:
如果需要,ASP.NET 还可对应用程序中的顶级项进行编译,其中包括 App_Code 文件夹中的应用程序代码。 有关更多信息,请参见本主题后面的“编译生命周期”。 |
|
为每个请求创建 ASP.NET 核心对象。 |
创建了应用程序域并对 HostingEnvironment 对象进行了实例化之后,ASP.NET 将创建并初始化核心对象,如 HttpContext、HttpRequest 和 HttpResponse。 HttpContext 类包含特定于当前应用程序请求的对象,如 HttpRequest 和 HttpResponse 对象。 HttpRequest 对象包含有关当前请求的信息,包括 Cookie 和浏览器信息。 HttpResponse 对象包含发送到客户端的响应,包括所有呈现的输出和 Cookie。 |
|
将 HttpApplication 对象分配给请求 |
初始化所有核心应用程序对象之后,将通过创建 HttpApplication 类的实例启动应用程序。 如果应用程序具有 Global.asax 文件,则 ASP.NET 会创建 Global.asax 类(从 HttpApplication 类派生)的一个实例,并使用该派生类表示应用程序。 说明:第一次在应用程序中请求 ASP.NET 页或进程时,将创建 HttpApplication 的一个新实例。 不过,为了尽可能提高性能,可对多个请求重复使用 HttpApplication 实例。
创建 HttpApplication 的实例时,将同时创建所有已配置的模块。 例如,如果将应用程序这样配置,ASP.NET 就会创建一个 SessionStateModule 模块。 创建了所有已配置的模块之后,将调用HttpApplication 类的 Init 方法。 下面的关系图说明了这种关系:
|
|
由 HttpApplication 管线处理请求。 |
在处理该请求时将由 HttpApplication 类执行以下事件。 希望扩展 HttpApplication 类的开发人员尤其需要注意这些事件。
|
在应用程序的生命周期期间,应用程序会引发可处理的事件并调用可重写的特定方法。 若要处理应用程序事件或方法,可以在应用程序根目录中创建一个名为 Global.asax 的文件。
如果创建了 Global.asax 文件,ASP.NET 会将其编译为从 HttpApplication 类派生的类,然后使用该派生类表示应用程序。
HttpApplication 进程的一个实例每次只处理一个请求。 由于在访问应用程序类中的非静态成员时不需要将其锁定,这样可以简化应用程序的事件处理过程。 这样还可以将特定于请求的数据存储在应用程序类的非静态成员中。 例如,可以在 Global.asax 文件中定义一个属性,然后为该属性赋一个特定于请求的值。
通过使用命名约定 Application_event(如 Application_BeginRequest),ASP.NET 可在 Global.asax 文件中将应用程序事件自动绑定到处理程序。 这与将 ASP.NET 页方法自动绑定到事件(如页的 Page_Load 事件)的方法类似。 有关详细信息,请参见 ASP.NET 页生命周期概述。
Application_Start 和 Application_End 方法是不表示 HttpApplication 事件的特殊方法。 在应用程序域的生命周期期间,ASP.NET 仅调用这些方法一次,而不是对每个 HttpApplication 实例都调用一次。
下表列出在应用程序生命周期期间使用的一些事件和方法。 实际远不止列出的这些事件,但这些事件是最常用的。
|
事件或方法 |
说明 |
|---|---|
|
Application_Start |
请求 ASP.NET 应用程序中第一个资源(如页)时调用。 在应用程序的生命周期期间仅调用一次 Application_Start 方法。 可以使用此方法执行启动任务,如将数据加载到缓存中以及初始化静态值。 在应用程序启动期间应仅设置静态数据。 由于实例数据仅可由创建的 HttpApplication 类的第一个实例使用,所以请勿设置任何实例数据。 |
|
Application_event |
在应用程序生命周期中的适当时候引发,请参见本主题前面的应用程序生命周期表中列出的内容。 Application_Error 可在应用程序生命周期的任何阶段引发。 由于请求会短路,因此 Application_EndRequest 是唯一能保证每次请求时都会引发的事件。 例如,如果有两个模块处理 Application_BeginRequest 事件,第一个模块引发一个异常,则不会为第二个模块调用 Application_BeginRequest 事件。 但是,会始终调用 Application_EndRequest 方法使应用程序清理资源。 |
|
在创建了所有模块之后,对 HttpApplication 类的每个实例都调用一次。 |
|
|
在销毁应用程序实例之前调用。 可使用此方法手动释放任何非托管资源。 有关更多信息,请参见清理非托管资源。 |
|
|
Application_End |
在卸载应用程序之前对每个应用程序生命周期调用一次。 |
在第一次对应用程序发出请求时,ASP.NET 按特定顺序编译应用程序项。 要编译的第一批项称为顶级项。 在第一次请求之后,仅当依赖项更改时才会重新编译顶级项。 下表描述编译 ASP.NET 顶级项的顺序。
|
Item |
Description |
|---|---|
|
App_GlobalResources |
编译应用程序的全局资源并生成资源程序集。 应用程序的 Bin 文件夹中的任何程序集都链接到资源程序集。 |
|
App_WebResources |
创建并编译 Web 服务的代理类型。 所生成的 Web 引用程序集将链接到资源程序集(如存在)。 |
|
Web.config 文件中定义的配置文件属性 |
如果应用程序的 Web.config 文件中定义了配置文件属性,则生成一个包含配置文件对象的程序集。 |
|
App_Code |
生成源代码文件并创建一个或更多个程序集。 所有代码程序集和配置文件程序集都链接到资源和 Web 引用程序集(如果有)。 |
|
Global.asax |
编译应用程序对象并将其链接到所有先前产生的程序集。 |
在编译应用程序的顶级项之后,ASP.NET 将根据需要编译文件夹、页和其他项。 下表描述编译 ASP.NET 文件夹和项的顺序。
|
Item |
Description |
|---|---|
|
App_LocalResources |
如果包含被请求项的文件夹包含 App_LocalResources 文件夹,则编译本地资源文件夹的内容并将其链接到全局资源程序集。 |
|
各个网页(.aspx 文件)、用户控件(.ascx 文件)、HTTP 处理程序(.ashx 文件)和 HTTP 模块(.asmx 文件) |
根据需要编译并链接到本地资源程序集和顶级程序集。 |
|
主题、主控页、其他源文件 |
在编译引用页时编译那些页所引用的各个主题、主控页和其他源代码文件的外观文件。 |
编译后的程序集缓存在服务器上并在后续请求时被重用,并且只要源代码未更改,就会在应用程序重新启动之间得到保留。
由于应用程序在第一次请求时进行编译,所以对应用程序的初始请求所花的时间会明显长于后续请求。 可以预编译应用程序以减少第一次请求所需的时间。 有关更多信息,请参见 如何:预编译 ASP.NET 网站。
Application Restarts(应用程序重新启动的次数)
修改 Web 应用程序的源代码将导致 ASP.NET 把源文件重新编译为程序集。 当修改应用程序中的顶级项时,应用程序中引用顶级程序集的其他所有程序集也会被重新编译。
此外,修改、添加或删除应用程序的已知文件夹中的某些类型的文件将导致应用程序重新启动。 下列操作将导致应用程序重新启动:
添加、修改或删除应用程序的 Bin 文件夹中的程序集。
添加、修改或删除 App_GlobalResources 或 App_LocalResources 文件夹中的本地化资源。
添加、修改或删除应用程序的 Global.asax 文件。
添加、修改或删除 App_Code 目录中的源代码文件。
添加、修改或删除配置文件配置。
添加、修改或删除 App_WebReferences 目录中的 Web 服务引用。
添加、修改或删除应用程序的 Web.config 文件。
当应用程序需要重新启动时,ASP.NET 将在重新启动应用程序域和加载新的程序集之前,从现有应用程序域和旧的程序集中为所有挂起的请求提供服务。
IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述的更多相关文章
- IIS 7.0 的 ASP.NET 应用程序生命周期概述(转载)
IIS 7.0 的 ASP.NET 应用程序生命周期概述更新:2007 年 11 月本主题介绍在 IIS 7.0 集成模式下运行以及与 IIS 7.0 或更高版本一起运行的 ASP.NET 应用程序的 ...
- IIS 7.0 的 ASP.NET 应用程序生命周期概述
文章:IIS 7.0 的 ASP.NET 应用程序生命周期概述 地址:https://msdn.microsoft.com/zh-cn/library/bb470252(v=vs.100).aspx ...
- 知识记录:ASP.NET 应用程序生命周期概述及Global.asax文件中的事件
IIS7 ASP.NET 应用程序生命周期概述 https://msdn.microsoft.com/zh-cn/library/bb470252(v=vs.100).aspx HttpApplica ...
- ASP.NET 应用程序生命周期概述[转自MSDN]
本文转自:http://msdn.microsoft.com/zh-cn/library/ms178473(VS.80).aspx 下表描述了 ASP.NET 应用程序生命周期的各个阶段. 阶段 ...
- ASP.NET 应用程序生命周期
1.请求到达IIS服务器,IIS根据文件后缀找到对应的ISAPI(Internet Server API)扩展来处理,这个配置可在网站属性里的“根目录”选项卡中的“配置”里看到.可以看到,ashx.a ...
- Asp.Net的应用程序生命周期概述
参考文献: MSDN:Asp.Net应用程序生命周期 博客:选择HttpHandler还是HttpModule? 1.HttpModule 应用程序(HttpApplication)引发的事件可以由实 ...
- [转]ASP.NET应用程序生命周期趣谈(三) HttpModule
在之前的文章中,我们提到过P_Module(HttpModule)这个能干的程序员哥们儿,它通过在项目经理HttpApplication那里得到的授权,插手整个应用程序级别的事件处理.所有的HttpM ...
- [转]ASP.NET应用程序生命周期趣谈(五) IIS7瞎说
Ps:建议初学者在阅读本文之前,先简要了解一下之前的几篇文章,以便于熟悉本文提到的一些关于IIS6的内容,方便理解.仅供参考. PS:为什么叫瞎说呢?我觉得自己理解的并不到位,只能是作为一个传声筒,希 ...
- [转]ASP.NET应用程序生命周期趣谈(一)
这几天一直在看ASP.NET应用程序生命周期,真是太难了,我理解起来费了劲了,但偏偏它又是那么重要,所以我希望能给大家带来一篇容易理解又好用的文章来帮助学习ASP.NET应用程序生命周期.这篇就是了. ...
随机推荐
- sql指定值排在前面
示例: SELECT COL1 FROM TABLE1 ORDER BY CASE WHEN COL1 = 'A' THEN 1 ELSE 2 END,COL1;//COL1为A的排在最前面,剩下的按 ...
- 5104 I-country
5104 I-country 在 N*M 的矩阵中,每个格子有一个权值,要求寻找一个包含 K 个格子的凸连通块(连通块中间没有空缺,并且轮廓是凸的,如书中图片所示),使这个连通块中的格子的权值和最大. ...
- Maven依赖的JAR包下载慢?赶紧看过来
相信许多JAVA开发者在日常工作中时常会碰到这种情况,那就是编译Maven工程时,工程所依赖的jar包文件下载非常慢,甚至经常出现下载不成功的问题,今天,小编就给大家讲讲如何提升Maven依赖包的下载 ...
- openstack的部署与运维
来公司几个月了,除了搭建了kvm虚拟机,使用3台虚拟机组合成一个openstack的网络环境.还没有正式将openstack搭建起来过.时间都在开发web程序.不过openstack也是要学习的.只能 ...
- 洛谷P5156 [USACO18DEC]Sort It Out
这题就是让你求字典序第k小的最短乱序子序列 转换一下,其实就是字典序第k大的最长上升子序列 就统计一下以i结尾的最长上升子序列\(f[i]\),长度为i的上升子序列的开头组成的集合\(v[i]\),转 ...
- Java的输出方式
System.out.println("...." + elements + "..."); 格式化输出: 我们知道输出格式化数字可以使用 printf() 和 ...
- 2019 CCPC-Wannafly Winter Camp Day1 (Div2, onsite)
solve:4/11 补题:6/11 A 机器人 补题:zz 这是一道分类讨论的题目,有一个规律就是如果必须要从第一个区到第二个区,那么最多转区两次(1到2一次,2到1一次),然后分类讨论即可,只要细 ...
- 经典C面试真题精讲
第一章 灵魂--指针 101. p++ 请分析下述代码的输出结果 int main() { char* p1 = "China"; char* p2, * p3; p2 = (); ...
- 使用Appium-Desktop捕获APP元素控件实现自动化控制
使用Appium捕获APP的元素控件 实现自动化控制 我是用的是华为P20手机进行测试,为了映射出它的adb端口,需再去官网下载安装一个华为手机助手,然后将手机调成开发者模式,连接时选择传输文件模式. ...
- $bzoj1014-JSOI2008$ 火星人$prefix$ $splay$ $hash$
题面描述 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:\(madamimadam\),我们将这个字符串的各个字符予以标号: 序号 1 2 3 4 5 6 7 8 ...
说明:
