* 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]]


-----
[[プログラム・開発系メモ]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS