Это был такой интересный вопрос. Мне потребовалось некоторое время, чтобы понять конвейер начальной загрузки Asp.Net. Я не буду вдаваться в подробности, потому что это займет много времени, поэтому я оставлю детали для OP.
По сути, среда Asp.Net динамически создает сборку и создает динамически создаваемый тип, который наследует ваш * 1003. *.
Итак, вот значение по умолчанию MvcApplication
public class MvcApplication : HttpApplication {
public static void Application_Start() {
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
Итак, что я подразумеваю под средой Asp.Net, динамически создавая другую сборку и тип? Вы заметите, что, проверив следующий код → Давайте изменим метод Application_Start
:
public static void Application_Start() {
var whatIsMyType = GetType();
//You will see that our actual type is of ASP.global_asax,
//which inherits MvcApplication, which inherits HttpApplication
//Other Stuff...
}
Где создается тип ASP.global_asax
? Вам нужно будет углубиться в исходный код, но позвольте мне дать вам подсказку
Так как же выглядит настоящий ASP.global_asax?
[System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()]
public class global_asax : global::<YourNameSpace>.MvcApplication {
private static bool @__initialized;
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
public global_asax() {
if ((global::ASP.global_asax.@__initialized == false)) {
global::ASP.global_asax.@__initialized = true;
}
}
protected System.Web.Profile.DefaultProfile Profile {
get {
return ((System.Web.Profile.DefaultProfile)(this.Context.Profile));
}
}
}
Наконец,мы можем перейти к реальному ответу: почему из-за статического Application_Start
приложение ведет себя неожиданно?
В HttpApplicationFactory
классе, который используется при начальной загрузке вашего приложения, есть следующая строкакода
methods = _theApplicationType.GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
foreach (MethodInfo m in methods) {
if (ReflectOnMethodInfoIfItLooksLikeEventHandler(m))
handlers.Add(m);
}
Загадка решена в _theApplicationType
. Пожалуйста, помните, что это ASP.global_asax type
. Ваш статический метод Application_Start
определен в типе MvcApplication
, поэтому отражение не найдет его через _theApplicationType
, и в результате он не будет назначен для вызова при запуске приложения.
Вот простой кодчтобы проверить это.
public class BaseClass {
public static void StaticMethodInBaseClass() {
}
}
public class DerivedClass {
public void DerivedClassMethod() {
}
}
//You will not get `StaticMethodInBaseClass` here
var methods = typeof(DerivedClass).GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);