2012-04-03 8 views
2

Global.asaxのHttpApplicationのBeginRequestイベントを購読する方法はありますか?Application_BeginRequestを購読する

私がやりたいことは、Global.asaxのApplication_Startメソッドにコードを追加して、私が持っているオブジェクトをBeginRequestメソッドとEndRequestメソッドにサブスクライブすることです。

これはHttpModulesで行うことができますが、HttpModulesは使用できません。

複数のウェブサイトのglobal.asaxページに同じ行のコードを追加できるようにすることが目的です。

答えて

3

私はいくつかのより多くの掘削を行ってきた、とことを見出しましたInitメソッドは私のために行く方法です。私はGlobal.asaxコンストラクタまたはApplication_Startメソッドが行く方法であるとは思っていません。 MSドキュメントによると:

アプリケーション開始時に静的データのみを設定する必要があります。インスタンスデータは、作成されたHttpApplicationクラスの最初のインスタンスでのみ使用できるため、設定しないでください。

「最初のリクエスト後にイベントが登録されないため、ここにイベントを登録しないでください。」と解釈しています。

Initメソッドは、すべてのモジュールが作成された後、HttpApplicationクラスのインスタンスごとに1回呼び出されます。

私はこれを次のように解釈しています:「アプリケーションを登録するたびにイベントが登録され、ハンドラは削除されないため、ここにイベントを登録してください。

ここでのキーは、「すべてのモジュールが作成された後」です。この前にコンストラクタが呼び出されるため、適切な場所にはなりません。 Application_Startについては、何度も試してみましたが、イベント登録をスティックすることはできません。これはドキュメントによって証明されています。

は、だから私はinitメソッドにコードを追加してみましたし、それが すなわち

public void Init() 
{ 
    this.BeginRequest += attach your handler here; 
    this.EndRequest += attach your other handler here; 
} 
+0

あなたのInit関数では、 'sender'変数はどこから来ますか? – billy

+1

@billy、私はポストを修正しました、私はいくつかまたは他のコピー貼り付けのエラーを作成する必要があります – CarllDev

2

私はGlobal.asax.vb(Class [Global])で

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs) 
    'Put your code here 
End Sub 

を持っており、それが動作します。

ただし、他のクラスのメソッドを呼び出す必要があります。これを達成するには、BeginRequest' inグローバル Newのハンドラを追加する必要があります。

例:

クラス:

Public Class MyHandlers 
    Public Shared Sub MyCode(sender As Object, e As System.EventArgs) 
    HttpContext.Current.Response.Write(HttpContext.Current.Request.Path) 
    End Sub 

End Class 

Global.asax.vb:

Public Class Global_asax 
    Inherits System.Web.HttpApplication 

    Public Sub New() 
    MyBase.New() 
    AddHandler Me.BeginRequest, AddressOf MyHandlers.MyCode 
    End Sub 

Rem .... 

End Class 
+0

をうまく働いていた私はあなたの提案の場所にコードを置くが、何らかの理由で、私のイベントは発生しません飽きません。 – CarllDev

+0

私は新しいASP.NETアプリケーションプロジェクト(Visual Basic)を作成し、Global.asaxを開いています。VBで、 'Sub Application_BeginRequest'が見つかりました。中にブレークポイントを入れて実行します。ブレークポイントがヒットしました。あなたはそれを試すことができますか? – IvanH

+0

Application_BeginRequestが起動しました。問題ではありません。問題は、そこにコードを入れずにApplication_BeginRequestが呼び出されたときに別のクラスのコードを起動できないことです。 ポイントは私のコードをApplication_BeginRequestにコピーしたくないということです – CarllDev

0
public void Application_Start(object sender, EventArgs e) 
{ 
    HttpApplication app = (HttpApplication)sender; 

    app.BeginRequest += attach your handler here; 
    app.EndRequest += attach your other handler here; 
} 
+0

私もこれを試しましたが、述べたように、私のコードは実行されません。もう少し掘り下げが必要ですが、ありがとう – CarllDev

+0

どこにコードを入れましたか? –

+0

私は、HttpApplicationをパラメータとするInitメソッドを持つクラスを持っています。 Initメソッドでは、クラス内のメソッドにリダイレクトされる: > BeginRequest + =および > EndRequest + =コード モジュール)が実行されます。 Global.asaxのApplication_Startでクラスの新しいインスタンスを作成し、Initを呼び出すと、接続が行われますが、デリゲートが呼び出されないため、接続が成功したとは思いません。 IvanHには答えがありますが、私はGloal.asaxに物を入れることは安全だと確信していません... – CarllDev

関連する問題