Global.asaxでIHttpModuleを使用する
-
03-07-2019 - |
質問
例外処理システムを書き直すというスリリングな仕事を与えられました。アプリケーション全体の観点から例外を処理することは望んでいることではありませんが、通常、チームがドアを押し出すために必要な膨大な量の作業に人員が不足している場合は避けられません。ここで例外処理のグローバル化されたソリューション:)
私は、一般的な解決策が何であるかを見るための良い狩りをしました。現時点では、Application_ErrorイベントでGlobal.asaxを使用して、セッション状態にあるServer.GetLastError()を実行します。その後、別のページにリダイレクトが呼び出され、セッションデータが取得されて人間が読める形式で出力されます。リダイレクトは、a)開発者に電子メールで送信され、b)開発者のみが表示できるWebページから表示されるエラー情報を慎重に監査するsprocも呼び出します。
私が見た新しい方法は、App_Codeのクラスを使用してIHttpModuleインターフェイスを使用して、これらの行に沿って何かを実行することです(これは私の簡単な実装です)
Imports Microsoft.VisualBasic
Public Class ErrorModule : Implements IHttpModule
Public Sub Dispose() Implements System.Web.IHttpModule.Dispose
' Not used
End Sub
Public Sub Init(ByVal context As System.Web.HttpApplication) Implements System.Web.IHttpModule.Init
AddHandler context.Error, AddressOf context_Error
End Sub
Public Sub context_Error(ByVal sender As Object, ByVal e As EventArgs)
Dim ex As Exception = HttpContext.Current.Server.GetLastError
' do something with the error
' call the stored procedure
' redirect the user to the error page
HttpContext.Current.Server.ClearError()
HttpContext.Current.Response.Redirect("index.htm")
End Sub
End Class
私の質問は、Global.asaxイベントを使用するよりもこのソリューションの利点は何ですか?また、データをエラーページに渡す最良の方法は何ですか?
編集:上記のコードは問題なく機能します;)
編集:また、HttpModuleはバックグラウンドでどのように機能しますか?アプリケーションの起動時にエラーイベントをその特定の関数に登録するだけですか?
更新:
さらに詳しく調べてみると、IHttpModuleインターフェイスの使用に関しては、セッションデータの取得は本当に面倒です。特定のシナリオで使用できるほど十分にHttpModuleが成熟しているとは思えません。セッションデータに固有のイベントが発生するまで、使用するには危険すぎるのです。
解決
モジュールを使用すると、簡単に取り外しできるという利点があります。モジュールを無効にするには、<!> lt; httpModules <!> gt;から削除するだけです。あなたの設定で。
データに関する限り、を試してください。 Server.Transfer または Server.RewritePath -現在のデータをすべて保持します(最後のサーバーエラーを含む)。
何らかの理由で最後のエラーがクリアされた場合、エラーを HttpContext.Items を転送/書き換えの前に、その後取得します。
編集:編集に応じて、IHttpModuleはその IHttpModule.Init の実装。
他のヒント
HttpModule
は、基本的にGlobal.asax
と同じことを行います。イベント処理のための、より再利用可能で自己完結型のモジュールとして設計されています。