.NET TIPS [ASP.NET]アプリケーション共通のロギングを行うには?(HTTPモジュール編)山田 祥寛2004/03/05 |
|
|
別稿「TIPS:[ASP.NET]アプリケーション共通のロギングを行うには?(Global.asax編)」では、アプリケーション共通のロギング機能をGlobal.asaxで実装する方法について紹介した。これとほとんど同様の動作を「HTTPモジュール」という機能を用いることでも実現できる。
よく似た概念として「HTTPハンドラ」という概念があるが(別稿「TIPS:[ASP.NET]特定の拡張子に対するアクセスを制限するには?」や「TIPS:[ASP.NET]ASP.NETアプリケーションに独自の拡張子を追加するには?」を参照)、HTTPハンドラが「リクエストを直接に処理する」ためのものであったのに対し、HTTPモジュールは「リクエスト処理に特定の機能を付加する」ための役割を提供する。例えば、ASP.NETの認証、セッション、キャッシング、エラー・ハンドルなどは、内部的にはすべてHTTPモジュールによって提供されている機能である。
まずは、HTTPモジュールが動作するまでの一連の手順を概観してみることにしよう。
1. HTTPモジュール・クラスを記述する
HTTPモジュール・クラスのコードは以下のとおり。ロギング(ログ収集)のロジックそのものは、別稿「TIPS:[ASP.NET]アプリケーション共通のロギングを行うには?(Global.asax編)」で紹介したものそのままなので、詳細はそちらを参照してほしい。
|
|
ロギングを行うHTTPモジュール・クラス(C#:CustomLogModule.cs) |
|
|
ロギングを行うHTTPモジュール・クラス(VB.NET:CustomLogModule.vb) |
HTTPモジュール・クラスを定義するために必要な条件は、以下の3点だ。
(1)System名前空間、System.Web名前空間をインポートする
HTTPモジュール・クラスを定義するには、最低限、System名前空間、System.Web名前空間を必要とする。もちろん、クラス内で必要なそのほかの名前空間も適宜、Imports(Using)ステートメントで追加すればよい。
(2)IHttpModuleインターフェイスを実装する
ASP.NETはIHttpModuleインターフェイスを介してHTTPモジュールを呼び出すため、すべてのHTTPモジュール・クラスは必ずIHttpModuleインターフェイスを実装しなければならない。
(3)Initメソッド、Disposeメソッドを記述する
IHttpModuleインターフェイスは、アプリケーションの起動時に呼び出されるInitメソッドと、終了時に呼び出されるDisposeメソッドを定義している。一般的には、Initメソッドで必要なリソースの確保やアプリケーション・イベントへのプロシージャの関連付けを行い、Disposeメソッドではリソースの解放処理を行う。
上記サンプルでも、Initメソッド内部で、Application.BeginRequestイベントに対して、Application_OnBeginRequestプロシージャ(ロギング機能)の関連付けを行っている。一般的にイベントとプロシージャの関連付けは、以下の構文で行うことができる。
|
|
C#の場合のイベントとメソッドの関連付け |
|
|
VB.NETの場合のイベントとプロシージャの関連付け |
なお、ここではリソースの解放は必要ないので、Disposeメソッドは空の内容を定義しているのみである。インターフェイスを実装する場合には、メソッドでの処理がまったくなくても空のメソッドを記述する必要があるので注意すること。
2. HTTPモジュール・クラスを配置する
HTTPモジュール・クラスは、使用に先立ってコマンドラインからコンパイルを行う必要がある。コンパイルの構文は以下のとおり。
|
|
C#の場合のコンパイル方法 |
|
|
VB.NETの場合のコンパイル方法 |
コンパイルに成功した場合C#、VB.NETいずれにおいても、CodeOutputHandler.dllが生成されるはずなので、これをアプリケーション・ルート配下の「\bin」フォルダにコピーすればよい。
3. web.configの設定を行う
HTTPモジュールを有効化するには、アプリケーション・ルート配下の構成ファイル(web.config)に以下のような記述をする必要がある。これによって、CustomLogModuleアセンブリ内のCom.Msn.Wings.CustomLogModuleクラスがHTTPモジュール・クラスとして追加される。
|
|
HTTPモジュール・クラスを追加したweb.config |
以上で、カスタムのHTTPモジュール・クラスの用意は完了だ。別稿「TIPS:[ASP.NET]アプリケーション共通のロギングを行うには?(Global.asax編)」で見たように、アプリケーション配下の任意のURLにアクセスすることで、自動的にアクセス情報がデータベースに記録されていくことを確認してほしい(ただし、Global.asaxのときにそうであったように、ASP.NETが処理の対象として認識するファイルに限定される。「.html」や「.txt」のようなファイルを含めてロギングを行う方法については、別稿「TIPS:[ASP.NET].htmlや.pdfファイルをフォーム認証やロギングの対象にするには?」を参照)。
なお、本稿と別稿「TIPS:[ASP.NET]アプリケーション共通のロギングを行うには?(Global.asax編)」の両方を参照して、Global.asaxとHTTPモジュール、いずれを用いればよいのか迷われた方もいるかもしれない。しかし、両者には一点決定的な違いがある。Global.asaxはアプリケーション単位にしか配置することができないが、HTTPモジュールはマシン(サーバ)単位に配置できるという点である。HTTPモジュールをサーバ単位に配置することで、サーバ共通のロギングが可能となる。マシン単位の配置を行う方法については、後日あらためて詳述することにしたい。
カテゴリ:Webフォーム 処理対象:ログ 使用ライブラリ:HorizontalAlignment列挙体(System.Windows.Forms名前空間) 関連TIPS:[ASP.NET]アプリケーション共通のロギングを行うには?(Global.asax編) 関連TIPS:[ASP.NET]特定の拡張子に対するアクセスを制限するには? 関連TIPS:[ASP.NET]ASP.NETアプリケーションに独自の拡張子を追加するには? 関連TIPS:[ASP.NET].htmlや.pdfファイルをフォーム認証やロギングの対象にするには? |
「.NET TIPS」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|