【问题标题】:Where are the life cycle events of ASP.Net declared? (NOT the event handlers)ASP.Net 的生命周期事件在哪里声明? (不是事件处理程序)
【发布时间】:2020-07-09 23:43:57
【问题描述】:

我有一个 ASP.Net MVC 应用程序。 里面有大名鼎鼎的Global.asax(我没碰过):

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}

现在,人们说这是事件 应用程序启动时被触发。 对不起,我在这里看到的不是事件——这是一种方法。 我相信某处有一个事件正在被触发,并且指向这个 METHOD(所以这个方法是一个事件处理程序。我错了吗?)

我的问题是事件本身在哪里?我在所有解决方案中寻找它并没有找到它。

【问题讨论】:

  • 您的应用程序继承了System.Web.HttpApplication 类,我想所有事件都在其中声明。 Application_Start 是事件处理器,你就在这里
  • 如果您想深入挖掘,请查看Call Stack,然后按照ReferenceSource 上的HttpApplication 类中的这些方法进行操作。
  • 好吧,这似乎比我最初想象的要多……但是,很难同意这里除了初始化和激活之外还有一个事件生命周期的前提HttpApplication ASP.NET 的实例,更具体地说是 ApplicationManager。关于Application_Start,它可能既不是事件也不是事件处理程序(没有引发它处理的事件)。 HttpApplication上有一个运行时编译,所以它可能是在Init事件处理范围内调用的可选方法...
  • 但我的概率是没有保证的..这是一个可以使用一些内幕信息的问题和前提。

标签: c# asp.net-mvc events global-asax eventhandler


【解决方案1】:

在获取堆栈跟踪导致调用 Application_Start 之后,我发现它就像

at WebApplication1.MvcApplication.Application_Start() in C:\Users\Elite\source\repos\WebApplication2\WebApplication1\Global.asax.cs:line 16
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
   at System.Web.HttpApplication.InvokeMethodWithAssert(MethodInfo method, Int32 paramCount, Object eventSource, EventArgs eventArgs)
   at System.Web.HttpApplication.ProcessSpecialRequest(HttpContext context, MethodInfo method, Int32 paramCount, Object eventSource, EventArgs eventArgs, HttpSessionState session)
   at System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app)
   at System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers)
   at System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context)
   at System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context)
   at System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext)

这个link包含整个东西的源代码,

private MethodInfo _onStartMethod; 

你可能对上面的字段感兴趣,它被设置在这个method中,如果你花几分钟看这段代码,你会发现 MVC 正在做的是扫描 global.ascx 中存在的方法文件(实际上是一个继承HttpApplication类的类)当然使用反射

此外,如果您观察堆栈跟踪,您会发现对方法 RegisterEventSubscriptionsWithIIS 的调用,我猜这就是您问题的答案:“事件从何而来”

【讨论】:

    猜你喜欢
    • 2012-10-08
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 2022-06-30
    相关资源
    最近更新 更多