web-dev-qa-db-ja.com

Application_StartとApplication_OnStartの違い

私は、ASP.NET MVCコードを既存のASP.NET Webformsプロジェクトに追加する過程にあります。 さまざまなチュートリアル は、Global.asaxのApplication_Start()から呼び出されるメソッドにルーティングを追加することを提案しています。私のGlobal.asaxには、セットアップコードを含むApplication_OnStart(Object、EventArgs)メソッドが既にあります。

StartとOnStartの両方を使用しようとすると、OnStartが呼び出されません(セットアップが失敗し、エラーが発生します)。どちらかを選択する必要があるようです。

私の質問は、どちらを使用すればよいですか?それらの違いは何ですか?彼らは異なる時間に呼び出されますか?

(注:この記事の執筆時点では、 topthreeGoogle ヒットは役に立たないか、誤解を招く可能性があります。スタックオーバーフローができることを願っていますそれを修正してください。)

37
Craig Walker

クラシック(レガシー)ASPには、global.asaファイルで定義されている場合、アプリケーションのライフサイクル中の指定されたポイントで実行される特別な関数名がいくつかあります。これらは次のように定義されます:

  • Application_OnStart-アプリケーションが最初のHTTP要求を受信したとき、および.ASPファイルが処理される直前に1回実行されます。
  • Application_OnEnd-すべての要求が処理された後、アプリケーションのシャットダウン中に1回実行されます。
  • Session_OnStart-各一意のユーザーセッションの開始時に実行されます。ユーザー/クライアントのCookieが無効になっている場合、ASPは既存のセッションを識別するセッションCookieを検出しないため、すべてのリクエストに対して実行されます。
  • Session_OnEnd理論的には!)ユーザーセッションが期限切れになるたびに実行されます。これで頑張ってください。

これらは基本的に古典的なASPランタイムに組み込まれています-これらを変更することはできず、これらのイベントに他のメソッドをアタッチすることはできません。

ASP.NETには、リフレクションを使用して特定の命名規則に準拠するメソッドを検索し、ASP.NETランタイムによって発生した一致するイベントに応じてそれらのメソッドを実行するAutoEventWireupというものがあります。最も一般的な例は_Page_Load_メソッドです。このメソッドは、ページライフサイクル中にLoadイベントを起動するPageクラスに応答して自動的に呼び出されます。

同じ手法を使用して、ハンドラをアプリケーションレベルのライフサイクルイベントにアタッチします。 ModuleName_EventNameまたはModuleName_OnEventNameという名前のメソッドを探し、パラメーター_()_または_(object sender, EventArgs e)_を取得しません。

ここに楽しい部分があります----(複数の一致するメソッドを定義する場合、ファイル内で最後に表示されるメソッドのみが実行されます。 (基本的に最後の方法が優先されます)

したがって、global.asax.csが次のようになっている場合:

_public class Global : System.Web.HttpApplication {
    protected void Application_Start() {
        Debug.WriteLine("A: Application_Start()");
    }

    protected void Application_Start(object sender, EventArgs e) {
        Debug.WriteLine("B: Application_Start(object sender, EventArgs e)");
    }

    protected void Application_OnStart() {
        Debug.WriteLine("C: Application_OnStart()");

    }
    protected void Application_OnStart(object sender, EventArgs e) {
        Debug.WriteLine("D: Application_OnStart(object sender, EventArgs e)");
    }
}
_

デバッグ出力にメッセージDが表示されます。そのブロックの最後のメソッドをコメントアウトすると、代わりにメッセージCが表示されます。

そのため、好きな命名規則を使用しますが、複数定義すると、ソースファイルの最後に表示されるものだけが実行されます。個人的にはApplication_Start(object sender, EventArgs e)に固執します。これは、Visual Studioプロジェクトテンプレートとほとんどの.NETデザイン/コーディングツールによって生成される署名だからです。

75
Dylan Beattie

ASP.Netアプリのライフサイクルに関するMicrosoftドキュメント によると、global.asaxファイル内でApplication_startメソッドを使用する必要があります。

Application_Start:ASP.NETアプリケーションの最初のリソース(ページなど)が要求されたときに呼び出されます。 Application_Startメソッドは、アプリケーションのライフサイクル中に1回だけ呼び出されます。このメソッドを使用して、キャッシュへのデータのロードや静的な値の初期化などの起動タスクを実行できます。

Application_OnStart:Application_OnStartイベントは、最初の新しいセッションが作成される前(Applicationオブジェクトが最初に参照されるとき)に発生します。 これはGlobal.asaにあります global.asaxではありません。

10
Parrots

Application_OnStart

Application_OnStart関数は、.aspファイルが処理される前、つまりテキストまたはグラフィックがレンダリングされてユーザーのブラウザーに送信される前に呼び出されます。この関数内で、Active Server PagesサーバーオブジェクトのCreateObjectメソッドへの次の呼び出しは、CDOレンダリングライブラリRenderingApplicationオブジェクトを作成します。この呼び出しが成功すると、objRenderApp変数に新しいオブジェクトへのポインターが含まれます。

私が見つけたすべての参照は.aspページを参照しています

Application_Start

Application_StartおよびApplication_Endメソッドは、HttpApplicationイベントを表さない特別なメソッドです。 ASP.NETは、各HttpApplicationインスタンスではなく、アプリケーションドメインのライフタイムに対して1回呼び出します。

このページは.aspxページを指します。したがって、MVCを使用し、global.asaxに言及しているので、これが使用すべきものです。

5
ChrisF