惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The GitHub Blog
The GitHub Blog
博客园 - 三生石上(FineUI控件)
V
V2EX
博客园 - 司徒正美
小众软件
小众软件
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Tailwind CSS Blog
Last Week in AI
Last Week in AI
雷峰网
雷峰网
月光博客
月光博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Apple Machine Learning Research
Apple Machine Learning Research
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
SegmentFault 最新的问题
美团技术团队
Hugging Face - Blog
Hugging Face - Blog
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
爱范儿
爱范儿
博客园 - 聂微东
量子位
J
Java Code Geeks
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Vercel News
Vercel News

博客园 - Bruce Xiao

select 语句的执行顺序 时间复杂度计算方法 活动图与流程图的区别 Tab标签 - Bruce Xiao - 博客园 过滤数据集DataTable方法 - Bruce Xiao - 博客园 Abstract 与 Vitrual 用法 在同一个DataSet中添加多个DataTable - Bruce Xiao - 博客园 C#文件读写常用类介绍[转] 获取当月的天数 谈SQL SERVER数据库中的索引 C#读取二进制字节流 Oracle字符函数 分组合并字符串 分页控件 .net控件开发系列 事件处理机制 三个接口两个方法 xml讀寫實例 - Bruce Xiao - 博客园 SQL2005 分頁存儲過程 对xml操作的主要方法[轉] - Bruce Xiao - 博客园 SQL2005 新功能:行列轉換
ASP.NET 应用程序生命周期概述
Bruce Xiao · 2011-08-01 · via 博客园 - Bruce Xiao

 ASP.NET 应用程序生命周期的各个阶段。

生命周期事件和 Global.asax 文件

在应用程序的生命周期期间,应用程序会引发可处理的事件并调用可重写的特定方法。若要处理应用程序事件或方法,可以在应用程序根目录中创建一个名为 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_StartApplication_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.Init

在创建了所有模块之后,对 HttpApplication 类的每个实例都调用一次。

Dispose

在销毁应用程序实例之前调用。可使用此方法手动释放任何非托管资源。有关更多信息,请参见清理非托管资源

Application_End

在卸载应用程序之前对每个应用程序生命周期调用一次。

编译生命周期

在第一次对应用程序发出请求时,ASP.NET 按特定顺序编译应用程序项。要编译的第一批项称为顶级项。在第一次请求之后,仅当依赖项更改时才会重新编译顶级项。下表描述编译 ASP.NET 顶级项的顺序。

说明

App_GlobalResources

编译应用程序的全局资源并生成资源程序集。应用程序的 Bin 文件夹中的任何程序集都链接到资源程序集。

App_WebResources

创建并编译 Web 服务的代理类型。所生成的 Web 引用程序集将链接到资源程序集(如存在)。

Web.config 文件中定义的配置文件属性

如果应用程序的 Web.config 文件中定义了配置文件属性,则生成一个包含配置文件对象的程序集。

App_Code

生成源代码文件并创建一个或更多个程序集。所有代码程序集和配置文件程序集都链接到资源和 Web 引用程序集(如果有)。

Global.asax

编译应用程序对象并将其链接到所有先前产生的程序集。

在编译应用程序的顶级项之后,ASP.NET 将根据需要编译文件夹、页和其他项。下表描述编译 ASP.NET 文件夹和项的顺序。

说明

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 将在重新启动应用程序域和加载新的程序集之前,从现有应用程序域和旧的程序集中为所有挂起的请求提供服务。