IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述

简介:

http://msdn.microsoft.com/zh-cn/library/ms178473(v=VS.100).aspx

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

 

image

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

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

创建了应用程序域并对 HostingEnvironment 对象进行了实例化之后,ASP.NET 将创建并初始化核心对象,如 HttpContextHttpRequest 和 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 类的开发人员尤其需要注意这些事件。

  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 方法(或异步版 IHttpAsyncHandler.BeginProcessRequest)。 例如,如果该请求针对某页,则当前的页实例将处理该请求。

  16. 引发 PostRequestHandlerExecute 事件。

  17. 引发 ReleaseRequestState 事件。

  18. 引发 PostReleaseRequestState 事件。

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

  20. 引发 UpdateRequestCache 事件。

  21. 引发 PostUpdateRequestCache 事件。

  22. 引发 EndRequest事件。

  23. 引发 PreSendRequestHeaders 事件。

  24. 引发 PreSendRequestContent 事件。

 

 


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

在应用程序的生命周期期间,应用程序会引发可处理的事件并调用可重写的特定方法。 若要处理应用程序事件或方法,可以在应用程序根目录中创建一个名为 Global.asax 的文件。

如果创建了 Global.asax 文件,ASP.NET 会将其编译为从 HttpApplication 类派生的类,然后使用该派生类表示应用程序。

HttpApplication 进程的一个实例每次只处理一个请求。由于在访问应用程序类中的非静态成员时不需要将其锁定,这样可以简化应用程序的事件处理过程。 这样还可以将特定于请求的数据存储在应用程序类的非静态成员中。 例如,可以在 Global.asax 文件中定义一个属性,然后为该属性赋一个特定于请求的值。

通过使用命名约定 Application_event(如 Application_BeginRequest),ASP.NET 可在 Global.asax 文件中将应用程序事件自动绑定到处理程序。 这与将 ASP.NET 页方法自动绑定到事件(如页的 Page_Load 事件)的方法类似。

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 方法使应用程序清理资源。

Init

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

Dispose

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

Application_End

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


HTTP Module

 

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

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





















本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/591286 ,如需转载请自行联系原作者


相关文章
|
4月前
|
域名解析 缓存 Linux
如何让你的.NET WebAPI程序支持HTTP3?
如何让你的.NET WebAPI程序支持HTTP3?
51 2
如何让你的.NET WebAPI程序支持HTTP3?
|
4月前
|
开发框架 安全 .NET
IIS服务器发布ASP.NET项目
对于云服务器,程序员一般不会陌生,如果项目需要发布到现网,那么服务器是必不可缺的一项硬性条件,那么如何在云服务器上部署一个项目,需要做哪些配置准备,下面就由本文档为大家讲解,本篇以IIS服务器发布ASP.NET项目为例。
50 1
|
1天前
|
开发框架 .NET 开发工具
LabVIEW加载.NET程序集
LabVIEW加载.NET程序集
|
2天前
|
XML 开发框架 .NET
LabVIEW中加载.NET 2.0,3.0和3.5程序集
LabVIEW中加载.NET 2.0,3.0和3.5程序集
11 4
|
2天前
|
开发框架 前端开发 JavaScript
ASP.NET AJAX使用方法概述(三)
ASP.NET AJAX使用方法概述(三)
|
11天前
|
C# Windows
一款.NET开源、简洁易用的Windows桌面小说阅读应用
一款.NET开源、简洁易用的Windows桌面小说阅读应用
|
13天前
|
开发框架 物联网 测试技术
【专栏】.NET 开发:打造领先应用的基石
【4月更文挑战第29天】本文探讨了.NET开发框架为何成为构建领先应用的首选。高性能与稳定性是.NET的核心优势,它采用先进的技术和优化策略,如.NET Core的轻量级设计和JIT/AOT编译模式。跨平台兼容性让开发者能用相同代码库在不同操作系统上构建应用。现代化的开发体验,如C#语言的创新特性和Visual Studio的强大工具,提升了开发者生产力。丰富的生态系统和广泛支持,包括庞大的开发者社区和微软的持续投入,为.NET提供了坚实后盾。
|
13天前
|
机器学习/深度学习 人工智能 Cloud Native
【专栏】洞察.NET 技术的前沿应用
【4月更文挑战第29天】本文探讨了.NET技术的前沿应用,包括.NET Core的跨平台崛起、云原生及AI/机器学习领域的整合。.NET Core支持多平台运行,开源社区的参与促进了其快速发展和性能优化。Xamarin与.NET MAUI助力跨平台移动应用和统一界面开发,而云原生应用借助.NET Core与Azure云服务得以轻松构建和部署。此外,ML.NET和TensorFlow.NET为.NET开发者提供了机器学习和深度学习工具,推动智能应用和边缘计算的创新。.NET技术正持续演进,引领软件开发新趋势。
|
13天前
|
人工智能 物联网 开发者
【专栏】探究.NET 技术的创新应用
【4月更文挑战第29天】本文探讨了.NET技术的最新进展和创新应用,包括.NET 5及后续版本的统一平台、性能提升、跨平台支持、云集成优化和开源社区的贡献。在创新应用场景中,重点介绍了微服务架构、物联网、AI、游戏开发和移动应用。未来,.NET将持续优化性能,深化云原生应用,集成新兴技术,扩大社区生态,并促进相关教育和培训。开发者应把握.NET技术的潜力,积极参与其发展,创造更多创新软件产品。
|
13天前
|
安全 Linux API
【专栏】.NET 开发:打造卓越应用的秘诀
【4月更文挑战第29天】本文介绍了.NET技术的起源、核心特性和应用场景,揭示了其打造卓越应用的秘诀。自2002年推出,.NET历经发展,现支持跨平台,包括.NET Core和.NET 5。其核心特性包括:跨平台兼容性、面向对象编程、内置安全性和高效性能。丰富的类库、强大的开发工具、简洁的语言语法以及活跃的社区支持,使.NET成为构建高效、安全应用的理想选择。随着技术进步,.NET将持续赋能开发者创造更多可能性。