C# Global.asax魔术函数

C# Global.asax魔术函数,c#,asp.net,asp.net-mvc,error-handling,C#,Asp.net,Asp.net Mvc,Error Handling,在Visual Studio中创建ASP.NET Mvc项目时,将创建一个Global.asax&Global.asax.cs。在这个.cs文件中,您可以找到标准的应用程序\u Start方法 我的问题是,这个函数是如何调用的?因为它不是覆盖。所以我猜这个方法名是按惯例命名的。Application\u Error方法也是如此 我想知道这些方法挂接在哪里。因为我编写了这些方法(而不是重写它们),所以在MSDN中找不到任何关于它们的文档。(我找到了页面,但它只告诉您挂接错误事件,并显示应用程序错误

在Visual Studio中创建ASP.NET Mvc项目时,将创建一个
Global.asax
&
Global.asax.cs
。在这个.cs文件中,您可以找到标准的
应用程序\u Start
方法

我的问题是,这个函数是如何调用的?因为它不是覆盖。所以我猜这个方法名是按惯例命名的。
Application\u Error
方法也是如此

我想知道这些方法挂接在哪里。因为我编写了这些方法(而不是重写它们),所以在MSDN中找不到任何关于它们的文档。(我找到了页面,但它只告诉您挂接
错误
事件,并显示
应用程序错误(objectsender,EventArgs e)
,但不显示事件和方法的链接方式。)


这并不是很神奇。。ASP.NET管道将所有这些连接起来

你可以

具体而言,您将对以下部分感兴趣:

HttpApplication
对象分配给请求

它由一系列事件组成,这些事件是按什么顺序触发的

该页面上到处都有链接(此处包含的链接太多),链接到其他包含更多信息的页面


ASP.NET自动将应用程序事件绑定到中的处理程序 使用命名约定应用程序_事件的Global.asax文件,例如 作为
应用程序\u BeginRequest
。这与ASP.NET类似 页面方法会自动绑定到事件,例如页面的
页面加载
事件

资料来源:
ASP.Net本身创建了它。以下是符合MSDN的流程-

  • 用户从Web服务器请求应用程序资源
  • ASP.NET接收应用程序的第一个请求
  • 为每个请求创建ASP.NET核心对象
  • 将HttpApplication对象分配给请求。在此步骤中,将处理Global.asax并自动关联事件
  • 请求由HttpApplication管道处理。在此步骤中,引发HttpApplication全局事件


从引用中-ASP.NET使用命名约定应用程序事件(如application_BeginRequest)自动将应用程序事件绑定到Global.asax文件中的处理程序。

以消除接受答案的“魔力”,ASP.Net管道自动将
HttpApplication
事件绑定到类中具有
Application\u EventName
的方法。如果(很像我)希望看到事件显式绑定到处理程序,可以通过重写
HttpApplication.Init()
来绑定这些事件,Visual Studio将生成具有正确签名的处理程序方法

public override void Init()
{
  this.BeginRequest += MvcAppliction_BeginRequest;
}

private void MvcApplication_BeginRequest(object sender, EventArgs e)
{
  ...
}

有一个

它并不是真正的魔法。ASP.NET管道将这些连接起来。@SimonWhitehead你能给我指一下这方面的任何文档吗,这样我就可以阅读它(/也许可以找到其他类似的函数)@SimonWhitehead任何足够先进的技术都无法与magic区分开来-Arthur C.Clarke这是一个很好的例子,任何人,像我一样,都想知道在哪里可以找到这些信息。正如最初的海报所提到的,它们是神奇的。它们应该是抽象的(mustoverride),然后在global.asax文件中启用以覆盖它们。有人怎么记得这些东西的名字和签名?@user1829319我不知道你的意思是什么。无法记住API或查找文档并不能带来神奇的效果。为什么要记住API?当函数名从基继承时,我应该能够重写它。这绝对是“神奇的”。它们不是由接口或基类具体定义的。这很神秘。@SimonWhitehead,但编译器不会告诉您MSDN上有关如何执行自动事件连接的文档已更改。如果我们有一个合适的基类,我们可以依靠编译器和其他工具(例如VisualStudio)来帮助我们。
public override void Init()
{
  this.BeginRequest += MvcAppliction_BeginRequest;
}

private void MvcApplication_BeginRequest(object sender, EventArgs e)
{
  ...
}