C#
 Computer >> コンピューター >  >> プログラミング >> C#

C# ASP.NET Web APIでログ記録用のアクションフィルターを作成する方法

アクションフィルターとは

ASP.NET Web APIにおけるアクションフィルター(Action Filter)は、アクションメソッドの実行前後に共通のロジックを差し込むための仕組みです。認証チェック、ログ記録、例外処理など、複数のアクションで横断的に必要となる処理を一箇所にまとめられるのが大きなメリットです。

特にOnActionExecutingメソッドはアクションメソッドの実行前に、OnActionExecutedメソッドは実行後に呼び出されるため、この2つをオーバーライドすることで、処理の前後に任意のロジックを追加できます。

LogAttributeの作成

ここでは、ActionFilterAttributeを継承したLogAttributeを作成し、アクションメソッドの実行前後でログ情報を出力してみましょう。

using System;
using System.Diagnostics;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;

namespace DemoWebApplication.Controllers
{
    public class LogAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            Debug.WriteLine(string.Format("Action Method {0} executing at {1}",
                actionContext.ActionDescriptor.ActionName, DateTime.Now.ToShortDateString()),
                "Web API Logs");
        }

        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            Debug.WriteLine(string.Format("Action Method {0} executed at {1}",
                actionExecutedContext.ActionContext.ActionDescriptor.ActionName,
                DateTime.Now.ToShortDateString()), "Web API Logs");
        }
    }
}

OnActionExecutingではアクション名と現在日時を含むログを、OnActionExecutedでも同様に実行完了時点のログを出力しています。カテゴリとして「Web API Logs」を指定している点にも注目してください。

コントローラーアクションへの適用

作成したLogAttributeは、属性(Attribute)としてアクションメソッドに付与するだけで利用できます。

using System.Web.Http;

namespace DemoWebApplication.Controllers
{
    public class DemoController : ApiController
    {
        [Log]
        public IHttpActionResult Get()
        {
            // 何らかの処理
            return Ok();
        }
    }
}

動作確認

[Log]属性を付けたGetアクションが呼び出されると、OnActionExecutingOnActionExecutedが自動的に実行され、デバッグコンソール(出力ウィンドウ)に次のようなログが出力されます。

  • アクション実行前:「Action Method Get executing at …」
  • アクション実行後:「Action Method Get executed at …」

C# ASP.NET Web APIでログ記録用のアクションフィルターを作成する方法

このようにアクションフィルターを活用すれば、個々のアクションメソッドにログ処理を直接記述することなく、宣言的な形でログ記録を実装できます。さらに、コントローラーレベルやグローバル設定でフィルターを登録すれば、アプリケーション全体へ一括適用することも可能です。

  1. C# ASP.NET Web APIのアクションメソッドからカスタム結果タイプを返す方法

    ASP.NET Web APIでは、IHttpActionResultインターフェースを実装することで、独自のカスタムクラスを結果タイプとして作成できます。IHttpActionResultインターフェースには、HttpResponseMessageインスタンスを非同期に生成する単一のメソッド ExecuteAsync が定義されています。public interface IHttpActionResult { Task<HttpResponseMessage> ExecuteAsync( CancellationToken cancellationToke

  2. C# ASP.NET Web APIにおけるコントローラーアクションの4つの戻り値の型とは?

    ASP.NET Web APIのアクションメソッドには、主に以下の4種類の戻り値の型を指定することができます。 void(戻り値なし) プリミティブ型/複合型 HttpResponseMessage IHttpActionResult 1. void(戻り値なし) すべてのアクションメソッドが必ずしも何かを返す必要はありません。戻り値の型としてvoidを指定することも可能です。 コード例 using DemoWebApplication.Models; using System.Web.Http; namespace DemoWebApplication.Controllers {