私の質問は似ていますが、同一ではありません:
ホスト (softsyshosting.com) が BeginRequest および EndRequest イベント ハンドラをサポートできないのはなぜですか? (そこで参照されている mvolo ブログも読みました)
目標は、system.webServer 構成を介して統合された通常の HttpModule を使用して、IHttpModule.Init イベント (またはモジュールの内部の任意の場所) で HttpApplication.BeginRequest を正常にフックすることです。
- Global.asax に侵入するか、
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 イベント ハンドラーをアタッチする安全な場所はどれですか?
どうもありがとう