#freeze
 * 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]]
 
 
 -----
 [[プログラム・開発系メモ]]
 
 #googleads(1,1)

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