`
justdoithz
  • 浏览: 49608 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

ASP.NET 应用程序生命周期概述

阅读更多
ASP.NET 应用程序生命周期概述<!---->
<!--Content type: DocStudio. Transform: devdiv2mtps.xslt.-->

本主题概述应用程序生命周期,列出重要的生命周期事件,并描述如何编写适合应用程序生命周期的代码。在 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。

Note注意

如果文件扩展名尚未映射到 ASP.NET,则 ASP.NET 将不会接收该请求。对于使用 ASP.NET 身份验证的应用程序,理解这一点非常重要。例如,由于 .htm 文件通常没有映射到 ASP.NET,因此 ASP.NET 将不会对 .htm 文件请求执行身份验证或授权检查。因此,即使文件仅包含静态内容,如果希望 ASP.NET 检查身份验证,也应使用映射到 ASP.NET 的文件扩展名创建该文件,如采用文件扩展名 .aspx。

Note注意

如果要创建服务于特定文件扩展名的自定义处理程序,必须在 IIS 中将该扩展名映射到 ASP.NET,还必须在应用程序的 Web.config 文件中注册该处理程序。有关更多信息,请参见 HTTP 处理程序介绍

ASP.NET 接收对应用程序的第一个请求。

当 ASP.NET 接收到对应用程序中任何资源的第一个请求时,名为 ApplicationManager 的类会创建一个应用程序域。应用程序域为全局变量提供应用程序隔离,并允许单独卸载每个应用程序。在应用程序域中,将为名为 HostingEnvironment 的类创建一个实例,该实例提供对有关应用程序的信息(如存储该应用程序的文件夹的名称)的访问。

下面的关系图说明了这种关系:

应用程序环境概览图形

如果需要,ASP.NET 还可对应用程序中的顶级项进行编译,其中包括 App_Code 文件夹中的应用程序代码。有关更多信息,请参见本主题后面的“编译生命周期”。

为每个请求创建 ASP.NET 核心对象。

创建了应用程序域并对 HostingEnvironment 对象进行了实例化之后,ASP.NET 将创建并初始化核心对象,如 HttpContextHttpRequestHttpResponseHttpContext 类包含特定于当前应用程序请求的对象,如 HttpRequestHttpResponse 对象。HttpRequest 对象包含有关当前请求的信息,包括 Cookie 和浏览器信息。HttpResponse 对象包含发送到客户端的响应,包括所有呈现的输出和 Cookie。

HttpApplication 对象分配给请求

初始化所有核心应用程序对象之后,将通过创建 HttpApplication 类的实例启动应用程序。如果应用程序具有 Global.asax 文件,则 ASP.NET 会创建 Global.asax 类(从 HttpApplication 类派生)的一个实例,并使用该派生类表示应用程序。

Note注意

第一次在应用程序中请求 ASP.NET 页或进程时,将创建 HttpApplication 的一个新实例。不过,为了尽可能提高性能,可对多个请求重复使用 HttpApplication 实例。

创建 HttpApplication 的实例时,将同时创建所有已配置的模块。例如,如果将应用程序这样配置,ASP.NET 就会创建一个 SessionStateModule 模块。创建了所有已配置的模块之后,将调用HttpApplication 类的 Init 方法。

下面的关系图说明了这种关系:

应用程序环境图形

HttpApplication 管线处理请求。

在处理该请求时将由 HttpApplication 类执行以下事件。希望扩展 HttpApplication 类的开发人员尤其需要注意这些事件。

  1. 对请求进行验证,将检查浏览器发送的信息,并确定其是否包含潜在恶意标记。有关更多信息,请参见 ValidateRequest脚本侵入概述

  2. 如果已在 Web.config 文件的 UrlMappingsSection 节中配置了任何 URL,则执行 URL 映射。

  3. 引发 BeginRequest 事件。

  4. 引发 AuthenticateRequest 事件。

  5. 引发 PostAuthenticateRequest 事件。

  6. 引发 AuthorizeRequest 事件。

  7. 引发 PostAuthorizeRequest 事件。

  8. 引发 ResolveRequestCache 事件。

  9. 引发 PostResolveRequestCache 事件。

  10. 根据所请求资源的文件扩展名(在应用程序的配置文件中映射),选择实现 IHttpHandler 的类,对请求进行处理。如果该请求针对从 Page 类派生的对象(页),并且需要对该页进行编译,则 ASP.NET 会在创建该页的实例之前对其进行编译。

  11. 引发 PostMapRequestHandler 事件。

  12. 引发 AcquireRequestState 事件。

  13. 引发 PostAcquireRequestState 事件。

  14. 引发 PreRequestHandlerExecute 事件。

  15. 为该请求调用合适的 IHttpHandler 类的 ProcessRequest 方法(或异步版 BeginProcessRequest)。例如,如果该请求针对某页,则当前的页实例将处理该请求。

  16. 引发 PostRequestHandlerExecute 事件。

  17. 引发 ReleaseRequestState 事件。

  18. 引发 PostReleaseRequestState 事件。

  19. 如果定义了 Filter 属性,则执行响应筛选。

  20. 引发 UpdateRequestCache 事件。

  21. 引发 PostUpdateRequestCache 事件。

  22. 引发 EndRequest 事件。

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

HTTP 模块

ASP.NET 应用程序生命周期可通过 IHttpModule 类进行扩展。ASP.NET 包含若干实现 IHttpModule 的类,如 SessionStateModule 类。您还可以自行创建实现 IHttpModule 的类。

如果向应用程序添加模块,模块本身会引发事件。通过使用 modulename_eventname 约定,应用程序可以在 Global.asax 文件中预订这些事件。例如,若要处理 FormsAuthenticationModule 对象引发的 Authenticate 事件,可以创建一个名为 FormsAuthentication_Authenticate 的处理程序。

默认情况下,ASP.NET 中会启用 SessionStateModule 类。所有会话事件将自动命名为 Session_event,如 Session_Start。每次创建新会话时都会引发 Start 事件。有关更多信息,请参见会话状态概述

请参见

分享到:
评论

相关推荐

    ASP.NET 应用程序生命周期

    #### 二、ASP.NET 应用程序生命周期概述 在 IIS7.0 集成模式下,ASP.NET 应用程序的生命周期可以分为几个关键阶段,每个阶段都涉及不同的处理过程。理解这些阶段对于优化应用程序性能、调试错误以及更好地管理资源至...

    ASP_NET 应用程序生命周期概述.mht

    ASP_NET 应用程序生命周期概述.mht

    ASP.NET 生命周期 整理讲义

    #### IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述 ASP.NET 是一个用于构建 Web 应用程序的强大框架,其设计考虑了高度的灵活性和可扩展性。在 IIS 5.0 和 6.0 下,ASP.NET 的应用程序生命周期主要包括以下几个...

    ASP.NET的WEB生命周期,

    #### 二、ASP.NET Web生命周期概述 ASP.NET Web生命周期主要包括以下几个关键阶段:初始化、加载视图状态、加载控件状态、预渲染、回发事件处理、渲染、卸载。下面我们将对这些阶段进行详细的解析。 #### 三、详细...

    asp.net mvc request生命周期流程图

    ### ASP.NET MVC Request 生命周期详解 #### 一、概述 ASP.NET MVC 是一种流行的 Web 开发框架,它将 Web 应用程序分为模型(Model)、视图(View)与控制器(Controller)三部分,以此来提高开发效率并增强代码的可维护...

    asp.net 应用实例

    ASP.NET 是微软公司推出的一种用于构建动态网站、Web 应用程序和服务的开发框架。它基于.NET Framework,提供了一种高效、安全且可扩展的方式来构建 Web 解决方案。本篇文章将深入探讨 ASP.NET 的核心概念、特性以及...

    ASP_NET 页生命周期概述

    ASP_NET 页生命周期概述ASP_NET 页生命周期概述ASP_NET 页生命周期概述ASP_NET 页生命周期概述ASP_NET 页生命周期概述ASP_NET 页生命周期概述

    ASP.NET程序设计及应用课件

    ASP.NET是一种由微软开发的用于构建Web应用程序的框架,它基于.NET Framework,为开发者提供了强大的工具和语言支持,如Visual Basic .NET (vb.net)。本课件专注于ASP.NET程序设计及其在实际应用中的方法,旨在帮助...

    ASP.NET应用程序设计网课答案

    除此之外,课程可能还会涉及其他主题,如ASP.NET的页面生命周期、控件、状态管理、数据访问技术(如ADO.NET或Entity Framework)、用户身份验证与授权、以及部署策略等。这些内容旨在使学生能够独立地设计、开发、...

    ASP.NET Web程序设计教程

    ASP.NET Web程序设计教程是针对开发人员的一门深入学习课程,旨在教授如何使用ASP.NET框架构建高效、功能丰富的Web应用程序。这门教程涵盖了从基础到高级的多个方面,旨在帮助初学者快速上手并逐步提升专业技能。 ...

    asp.net页面生命周期

    #### 二、ASP.NET页面生命周期概述 ASP.NET页面生命周期主要由以下八个关键阶段组成: 1. **页请求(Page Request)** - 用户请求页面时,ASP.NET首先判断是否需要分析和编译页面。 - 如果页面已经被缓存,且无需...

    ASP.NET Web程序设计电子教案

    ASP.NET Web程序设计是微软开发的一种用于构建动态网站、Web应用程序和Web服务的技术。这个电子教案专注于使用C#编程语言进行开发,以下是根据压缩包文件的名称所涵盖的知识点的详细说明: 1. **第一章 ASP.NET概述...

    ASP.NET程序设计与开发

    1. **ASP.NET概述**:ASP.NET是.NET Framework的一部分,它为构建动态网站、Web应用程序和Web服务提供了强大的支持。ASP.NET提供了多种开发模型,如Web Forms、MVC(Model-View-Controller)和Web Pages,每种模型都...

    asp.net程序设计教程

    ASP.NET是微软公司推出的一种用于构建动态网站、Web应用程序和Web服务的开发框架。它基于.NET Framework,为开发者提供了一种高效、强大的工具,用于创建功能丰富的网页应用。本教程将深入讲解ASP.NET的核心概念、...

    asp.net程序设计基础教程

    ASP.NET是微软公司开发的一种用于构建Web应用程序的框架,它基于.NET Framework,为开发者提供了丰富的工具和库,简化了Web应用的开发过程。本教程针对初学者,将深入讲解ASP.NET程序设计的基础知识,帮助你从零开始...

    ASP.NET程序设计基础教程(第2版)课后习题及答案

    1. **第一章**:通常介绍ASP.NET的基础知识,包括.NET Framework概述,Web应用程序的生命周期,以及如何创建第一个ASP.NET页面。习题答案可能会解析IIS与ASP.NET的关系,以及WebForm和MVC两种开发模式的区别。 2. *...

    Web程序设计-ASP.NET使用网站开发源代码

    - ASP.NET的核心概念,如页面生命周期、事件模型和状态管理机制也会被提及。 2. **ASP.NET应用程序基础 (ch02 ASP.NET应用程序基础.ppt)** - 这部分可能涵盖了ASP.NET的基本结构,如Web Forms、MVC和Web API,...

    asp.net 程序设计教程 电子教案

    ASP.NET是由微软开发的一个强大的Web应用程序框架,用于构建动态、数据驱动的网站和应用。它构建在.NET Framework之上,提供了一种高效、易于使用的开发环境,支持多种编程语言,包括VB.NET和C#。 在VB.NET语法中,...

    ASP.NET应用教程

    ASP.NET是微软公司推出的一种用于构建Web应用程序的框架,它基于.NET Framework,为开发者提供了强大且易用的工具,用于创建动态网站、Web服务和Web应用程序。本教程将深入探讨ASP.NET的应用,帮助读者掌握其核心...

    ASP.Net应用对象

    2. **添加代码**: 在Global.asax.cs文件中,这个文件包含了ASP.NET应用程序的生命周期事件。例如,可以在`Application_Start`方法中初始化应用对象,如: ```csharp protected void Application_Start(object ...

Global site tag (gtag.js) - Google Analytics