web-dev-qa-db-ja.com

Global.asaxマジック関数

Visual StudioでASP.NET Mvcプロジェクトを作成すると、_Global.asax_および_Global.asax.cs_が作成されます。この.csファイルには、標準の_Application_Start_メソッドがあります。

私の質問は次のとおりです、この関数はどのように呼び出されますか?オーバーライドではないからです。したがって、私の推測では、このメソッド名は慣例によるものです。 _Application_Error_メソッドについても同じことが言えます。

これらのメソッドがどこにフックされているのか知りたいです。これらのメソッドを(オーバーライドではなく)作成しているため、MSDNでそれらのドキュメントを見つけることができませんでした。 ( this ページが見つかりましたが、Errorイベントにフックするように指示するだけで、Application_Error(object sender, EventArgs e)を表示しますが、イベントとメソッドのリンク方法は表示しません。)

_//Magicly called at startup
protected void Application_Start() 
{
    //Omitted
}

//Magicly linked with the Error event
protected void Application_Error(object sender, EventArgs e)
{
    //Omitted
}
_
27
SynerCoder

魔法ではありません。ASP.NETパイプラインは、これらすべてを結び付けます。

これに関するドキュメントを参照してください

具体的には、以下のパーツに興味があります。

HttpApplicationオブジェクトがリクエストに割り当てられます。

発生するイベントのリストとその順序で構成されます。

そのページ全体にリンクがあり(ここに含めるには多すぎます)、さらに多くの情報を含む他のさまざまなページにリンクしています。


ASP.NETは、Application_BeginRequestなどの命名規則Application_eventを使用して、Global.asaxファイル内のハンドラーにアプリケーションイベントを自動的にバインドします。これは、ASP.NETページメソッドがページのPage_Loadイベントなどのイベントに自動的にバインドされる方法に似ています。

ソースhttp://msdn.Microsoft.com/en-us/library/ms178473.aspx

15
Simon Whitehead

受け入れられた答えの「魔法」を分かりやすくするために、ASP.Netパイプラインは、クラスの_Application_EventName_を使用して、HttpApplicationイベントをメソッドに自動的にバインドします。 (私のように)ハンドラーに明示的にバインドされたイベントを表示する場合は、HttpApplication.Init()をオーバーライドすることでバインドできます。VisualStudioは、適切な署名でハンドラーメソッドを生成します。

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

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

イベントをバインドするこの方法の例 があります

2
Scott Rickman

ASP.Net自体が作成します。 MSDNによるフローは次のとおりです-

  • ユーザーがWebサーバーからアプリケーションリソースを要求します。
  • ASP.NETは、アプリケーションの最初の要求を受け取ります。
  • ASP.NETコアオブジェクトは、リクエストごとに作成されます。
  • HttpApplicationオブジェクトがリクエストに割り当てられます。このステップでは、Global.asaxが処理され、イベントが自動的に関連付けられます。
  • 要求は、HttpApplicationパイプラインによって処理されます。このステップでは、HttpApplication Globalイベントが発生します。

参照はこちら-ASP.Net Application Life Cycle。

参照から-ASP.NETは、Application_BeginRequestなどの命名規則Application_eventを使用して、アプリケーションイベントをGlobal.asaxファイル内のハンドラーに自動的にバインドします。

1
ramiramilu