* ASP.NET 開発メモ [#dec2bd3b] #contents ** ASP.NET で 例外を検出する方法 [#e43308f8] Global.aspx に、エラー発生時のハンドラを記述すれば良い。 <%@ Import Namespace="System.IO" %> <script Language="C#" runat="Server"> void Application_OnError(Object sender, EventArgs e) { // ここでログに書くなどする。 Exception err = Server.GetLastError().InnerException; logger.Error( "エラーだよん。", err ); } </script> スクリプトではなく、コードに書く場合は、 <%@ Application Codebehind="Global.asax.cs" Inherits="Sample.Global"%> として、Global.asax.cs に using System; using System.Diagnostics; namespace Sample { public class Global : System.Web.HttpApplication { public Global() { InitializeComponent(); } protected void Application_Error(Object sender, EventArgs e) { // ここでログに書くなどする。 Exception err = Server.GetLastError().GetBaseException(); logger.Error( "エラーだよん。", err ); } } } などと書く。 Global.asax は、ASP.NET のルートに置く。 ※ちなみに、上の logger は [[log4net]] なんか使えるかと。 コードでは次のイベントも拾うことができる。 |BGCOLOR(#CCFFCC):イベントハンドラ|BGCOLOR(#CCFFCC):タイミング| |Application_Start|アプリケーションの初回起動時。| |Application_End|アプリケーションが破棄された時。| |Session_Start|ユーザーセッションの初回起動時。| |Session_End|ユーザーセッションの終了時。| |Application_BeginRequest|GETやPOSTなどのリクエスト発生時。| |Application_EndRequest|GETやPOSTなどのリクエスト終了時。| |Application_Disposed|CLRがASP.NETアプリケーションを最終的にメモリから破棄するタイミング。| |Application_Error|アプリケーション内で処理されない例外が発生した時。| *** 参考 [#l8572906] - [[[ASP.NET]アプリケーション内で発生したエラー情報をロギングするには?:http://www.atmarkit.co.jp/fdotnet/dotnettips/168asperrlog/asperrlog.html]] ** HTTP サーバのイベントをログに残す方法 [#j1f9638b] IHttpModule インタフェースを持つモジュールクラスを作れば良い。 using System; using System.Web; namespace Sample { public class HttpLoggerModule : IHttpModule { public HttpLoggerModule() : base() { } public void Init(HttpApplication application) { // TODO: ここで取得したいイベントハンドラを追加する。 application.BeginRequest += (new EventHandler(this.Application_BeginRequest)); application.EndRequest += (new EventHandler(this.Application_EndRequest)); } public void Dispose() { // TODO: リソースの解放処理。 } private void Application_BeginRequest(Object sender , EventArgs e) { HttpContext context = ((HttpApplication)sender).Context; logger.Debug( "-- BeginRequest" ); logger.Debug( String.Format( @"URL: ""{0}""", context.Request.Url.ToString() ) ); } private void Application_EndRequest(object sender, EventArgs e) { logger.Debug( "-- EndRequest" ); } } } 上のようなクラスをつくったら、.NET クラスライブラリとしてコンパイル。 HttpLoggerModule.dll というようなバイナリファイルができるので、 これを使うアプリケーションのプロジェクトで、参照設定に追加する。 あとは、そのアプリケーションの web.config に、このモジュールを使うぞ、という設定をする。 <?xml version="1.0" encoding="utf-8" ?> <configuration> <system.web> <httpModules> <add name="HttpLoggerModule" type="Sample.HttpLoggerModule, HttpLoggerModule" /> </httpModules> </system.web> </configuration> *** 参考 [#xadf92f1] - [[[ASP.NET]アプリケーション共通のロギングを行うには?:http://www.atmarkit.co.jp/fdotnet/dotnettips/130asploghttp/asploghttp.html]] ----- [[プログラム・開発系メモ]]