ASP.NET 開発メモ

ASP.NET で 例外を検出する方法

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 なんか使えるかと。

コードでは次のイベントも拾うことができる。

イベントハンドラタイミング
Application_Startアプリケーションの初回起動時。
Application_Endアプリケーションが破棄された時。
Session_Startユーザーセッションの初回起動時。
Session_Endユーザーセッションの終了時。
Application_BeginRequest?GETやPOSTなどのリクエスト発生時。
Application_EndRequest?GETやPOSTなどのリクエスト終了時。
Application_DisposedCLRがASP.NETアプリケーションを最終的にメモリから破棄するタイミング。
Application_Errorアプリケーション内で処理されない例外が発生した時。

参考

HTTP サーバのイベントをログに残す方法

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>

参考


プログラム・開発系メモ


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-05-15 (土) 12:07:26 (5327d)