web-dev-qa-db-ja.com

asp.net-mvcでApplication_BeginRequest()をどのように接続しますか

global.aspx.csにasp.net-mvcプロジェクトから表示されます

 protected void Application_BeginRequest()
 {
 }

しかし、これをプロジェクトに追加しようとすると、このメソッドを呼び出しているものが表示されません。基本System.Web.HttpApplicationにこのイベントがあることがわかりますが、このイベントをオーバーライドしたり、このイベントにサブスクライブしたりするものは見当たりません。

Asp.net-mvcでApplication_BeginRequestを接続する方法を誰かが説明できますか?

43
leora

Cosの答えはあまり正確ではないようです。ベースHttpApplicationクラスが自動的に行うので、接続する必要はありません。ここにはインターフェースもオーバーライドもありません。 HttpApplicationはリフレクションを使用して、メソッド名に基づいてこれらのメソッドをイベントに結び付けます。そのため、しばらくの間フレームワークに存在していたのは、ちょっとした慣習ベースの魔法です。それは非常に奇妙なことであり、彼らは昔のClassic ASP=との類似性を維持するため、および/または小さなHttpModulesをたくさん書くことを避けるためのショートカットを提供するためだけにそれをしたと思います。

好奇心が強い人のために、ReflectorでHttpApplicationをロードし、HookupEventHandlersForApplicationAndModules()メソッドを探してください。または、HttpApplicationFactoryをロードし、ReflectOnApplicationType()およびReflectOnMethodInfoIfItLooksLikeEventHandler()(その名前が大好き!)メソッドを確認します。

Rick Strahlは数年前に彼のブログでこれについて議論しました。

ASP.NETを使用するために本当に知っておく必要があるものですか?いいえ、しかし、それを知ることは確かに謎の一部を取り除きます。

110

任意のASP.NETアプリケーションオブジェクトである(またはクラス)タイプ:

public class Global : System.Web.HttpApplicationこれはglobal.asaxにあります)

IISによって呼び出されるASP.NETエンジンはオブジェクトのインスタンスを作成し、HttpApplicationインターフェースはApplication_BeginRequestを要求します。これはIISによって(ISAPI経由で)呼び出されます

ASP.NETエンジンがクラスのインスタンスを作成すると、次のようになります。

HttpApplication thisAspApp = new YourASPApplication()
thisApplication.Begin_Request()

アプリを派生型としてキャストするため、オーバーライドを必要とせずに、既知のインターフェイスに直接アクセスできます。 HttpApplicationはクラスですが、キャストによってインターフェースとして使用されています。クラスに新しいメソッド(またはプロパティ)を追加すると、ASP.NETエンジンはアプリケーションをジェネリックHttpApplicationとしてのみ認識するため、そのメソッドにアクセスできません。 VSでglobal.asaxに移動し、クラス宣言でHttpApplicationを右クリックして[定義に移動]を選択する(またはF12キーを押す)と、基本クラスの構造を確認できます。 (または、MSDNオンラインで見つけることができます)。

3
Cos Callis