13

私の質問は似ていますが、同一ではありません:

ホスト (softsyshosting.com) が BeginRequest および EndRequest イベント ハンドラをサポートできないのはなぜですか? (そこで参照されている mvolo ブログも読みました)

目標は、system.webServer 構成を介して統合された通常の HttpModule を使用して、IHttpModule.Init イベント (またはモジュールの内部の任意の場所) で HttpApplication.BeginRequest を正常にフックすることです。

  1. Global.asax に侵入するか、
  2. HttpApplication をオーバーライドします (モジュールは自己完結型で再利用可能であることを意図しているため、たとえば、次のような構成があります):

    <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules>
      <remove name="TheHttpModule" />
      <add name="TheHttpModule" type="Company.HttpModules.TheHttpModule" preCondition="managedHandler" /> 
    

これまでのところ、リスナーを HttpApplication.BeginRequest にアタッチしようとしたどの戦略も、次の 2 つの結果のいずれかになります。症状 1 は、BeginRequest が起動しないことです。または、症状 2 は、すべてのマネージド リクエストで次の例外がスローされることです。ユーザーコードからキャッチして処理します:

Stack Trace:
[NullReferenceException: Object reference not set to an instance of an object.]
System.Web.PipelineModuleStepContainer.GetEventCount(RequestNotification notification, Boolean isPostEvent) +30
System.Web.PipelineStepManager.ResumeSteps(Exception error) +1112
System.Web.HttpApplication.BeginProcessRequestNotification(HttpContext context, AsyncCallback cb) +113
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +616

app.BeginRequest += new EventHandler(this.OnBeginRequest)Init でコメントアウトすると、もちろん例外が停止します。Init は Context または Request オブジェクトをまったく参照しません。

私が試してみました:

  • プロジェクト内のどこからでも HttpContext.Current へのすべての参照を削除しました (まだ症状 1)
  • OnBeginRequest メソッドの本体からすべてのコードを削除してテストし、問題がメソッドの内部にないことを確認しました (= 例外)
  • スタック トレースをスニッフィングし、スタックが InitializeApplication によって開始されていない場合 (= BeginRequest が起動しない場合) にのみ app.BeginRequest+=... を呼び出す
  • Init を介した 2 回目のパスで app.BeginRequest+= を呼び出すだけです (= BeginRequest は起動しません)。

良いアプローチを知っている人はいますか?モジュール内で Application_Start をフックするための間接的な戦略はありますか (ありそうにありません)。a) モジュールのコンストラクターまたは Init メソッドからフックできる別のイベント、および b) その後、BeginRequest イベント ハンドラーをアタッチする安全な場所はどれですか?

どうもありがとう

4

2 に答える 2

3

HttpModule の Init メソッドは、1 つの Web アプリケーションによって複数回呼び出されます (global.asax の Application_Start は、AppDomain ごとに 1 回だけ呼び出されます)。

Init は実際、BeginRequest にフックする場所です。

私もこのエラーに遭遇しました。これは、BeginRequest イベントに複数回フックしたことが原因でした。IIS 7 統合モードのバグかどうかはわかりません...

app.BeginRequest を実行するとき、context パラメータを使用して IHttpModule の Init メソッドに context.BeginRequest を呼び出していますか、それとも HttpContext.Current.BeginRequest += ... を呼び出していますか?

于 2010-09-14T20:34:19.873 に答える