在ASP.NET中运行代码的绝对最早的地方的执行顺序

时间:2013-02-20 18:06:41

标签: asp.net lifecycle

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

  • 处理web.config
  • WebActivator PreApplicationStartMethod
  • WebActivator PostApplicationStartMethod
  • Global.asax Application_Start

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

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

WebActivator PreApplicationStartMethod

中使用的Foo类
  • 静态构造函数
  • 静态只读字段

WebActivator PostApplicationStartMethod

中使用的Bar类
  • 静态构造函数
  • 静态只读字段

Global.asax Application_Start

中使用的Baz类
  • 静态构造函数
  • 静态只读字段

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

3 个答案:

答案 0 :(得分:11)

静态构造函数和静态字段初始化由运行时决定,而不是ASP.NET。 Eric Lippert最近发布了一篇很棒的four - part blog series详细介绍了它们的工作原理。

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

根据Phil Haack的a blog post,该属性使开发人员有机会在应用程序启动期间调用另外两种方法:BuildProvider.RegisterBuildProviderBuildManager.AddReferencedAssemblyBuildManager.AddReferenceAssembly的MSDN文档指出此方法只能在应用程序的Application_PreStartInit阶段执行,这表明当System.Web.PreApplicationStartMethodAttribute标记的所有方法都被执行时。

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

总而言之,订单是:

  1. 将Web.config读入内存
  2. 标有PreApplicationStartMethodAttribute
  3. 的方法
  4. HttpApplication.Application_Start
  5. 标有WebActivator.PostApplicationStartMethodAttribute
  6. 的方法

答案 1 :(得分:2)

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

  • 请求申请资源。
  • 统一管道收到第一个申请请求。
  • 为每个请求创建响应对象。
  • 将HttpApplication对象分配给请求
  • 请求由HttpApplication pipeline处理。

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

ASP.NET Application Life Cycle

请参阅ASP.NET Application Life Cycle Overview

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

专门回答您的问题

根据WebActivator project page,这是事件的顺序:

  1. 处理web.config
  2. WebActivator PreApplicationStartMethod
  3. Global.asax Application_Start
  4. WebActivator PostApplicationStartMethod
  5. 就静态初始化而言,请参阅贾斯汀在答案中链接的Eric Lipperts posts

答案 2 :(得分:0)

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

你的问题非常广泛。你有什么想在这里完成的事情,希望磨练这个过程的哪个部分对你想做的事情是理想的?