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

有许多地方可以在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类,并且该类包含静态构造函数和静态只读字段.

解决方法

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

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

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

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

总而言之,订单是:

> Web.config被读入内存>使用PreApplicationStartMethodAttribute标记的方法> HttpApplication.Application_Start>使用WebActivator.PostApplicationStartMethodAttribute标记的方法

相关文章

引言 本文从Linux小白的视角, 在CentOS 7.x服务器上搭建一个...
引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要...
一. 宏观概念 ASP.NET Core Middleware是在应用程序处理管道...
背景 在.Net和C#中运行异步代码相当简单,因为我们有时候需要...
HTTP基本认证 在HTTP中,HTTP基本认证(Basic Authenticatio...
1.Linq 执行多列排序 OrderBy的意义是按照指定顺序排序,连续...