3

在 ASP.NET 中有很多地方可以执行初始化代码:

  • web.config 被处理
  • 网络激活器PreApplicationStartMethod
  • 网络激活器PostApplicationStartMethod
  • 全球.asax Application_Start

这些事件的顺序是什么?此列表中是否还有其他附加项目?

编辑:由于提到静态与第一次调用位置相关,我将为他们分解这个

在 WebActivator 中使用的 Foo 类PreApplicationStartMethod

  • 静态构造函数
  • 静态只读字段

在 WebActivator 中使用的 Bar 类PostApplicationStartMethod

  • 静态构造函数
  • 静态只读字段

在 Global.asax 中使用的 Baz 类 Application_Start

  • 静态构造函数
  • 静态只读字段

为清楚起见,假设在上述示例中,每个示例都依赖于该位置中使用的 Foo/Bar/Baz 类,并且该类包含静态构造函数和静态只读字段。

4

3 回答 3

11

静态构造函数和静态字段初始化由运行时决定,而不是 ASP.NET。Eric Lippert 最近发布了一个很棒的由部分组成博客 系列,详细介绍了它们的工作原理。

至于您提到的其余项目,标有的方法System.Web.PreApplicationStartMethodAttribute首先执行。根据该属性的 MSDN 文档,不能保证调用这些方法的顺序。

根据Phil Haack的博客文章,此属性使开发人员有机会在应用程序启动期间调用另外两种方法:BuildProvider.RegisterBuildProviderBuildManager.AddReferencedAssembly. MSDN 文档BuildManager.AddReferenceAssembly声明此方法只能在应用程序的 Application_PreStartInit 阶段执行,这表明这System.Web.PreApplicationStartMethodAttribute是执行所有由 标记的方法的时间。

WebActivator 使用框架PreApplicationStartMethodAttribute挂钩到应用程序的启动。一旦被调用,它将搜索并执行所有标记的方法,WebActivator.PreApplicationStartMethodAttribute然后动态注册一个 HttpModule,该模块稍后将调用所有标记的方法PostApplicationStartMethodAttribute- 在 HttpApplication 类中调用 Application_Start 之后。

所以,总而言之,顺序是:

  1. Web.config 被读入内存
  2. 标有 a 的方法PreApplicationStartMethodAttribute
  3. HttpApplication.Application_Start
  4. 标有的方法WebActivator.PostApplicationStartMethodAttribute
于 2013-02-20T19:32:47.630 回答
2

应用程序生命周期如下所示:

  • 请求应用程序资源。
  • 统一管道接收应用程序的第一个请求。
  • 为每个请求创建响应对象。
  • 将 HttpApplication 对象分配给请求
  • 该请求由HttpApplication 管道处理。

此外,以下是请求管道中发生的事件:

ASP.NET 应用程序生命周期

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

静态构造函数和静态只读字段(实例化内联)在您的代码第一次使用该类型时进行初始化。这可能发生在应用程序生命周期的任何时候。

专门回答你的问题

根据WebActivator 项目页面,这是事件的顺序:

  1. web.config 被处理
  2. WebActivator PreApplicationStartMethod
  3. Global.asax Application_Start
  4. WebActivator PostApplicationStartMethod

就静态初始化而言,请参阅贾斯汀在他的回答中链接的Eric Lipperts 帖子

于 2013-02-20T18:18:29.840 回答
0

您当前的列表中有一些不一定与 ASP.NET 相关的内容(静态只读字段等),但此链接描述了 ASP.NET 生命周期。发生了很多事情,其中​​许多允许自定义,如果您有充分的理由,您可以在其中注入一些自己的代码。

你的问题很广泛。有没有什么你想要在这里完成的事情,可以希望在这个过程的哪一部分对你想做的事情来说是理想的?

于 2013-02-20T18:12:32.960 回答