ASP.NET Web API で 独自 フィルター の実装方法

0 件のコメント

ここでは、 ASP.NET Web API において、独自フィルター を実装する方法を掲載します。 独自フィルター を実装することで、 RESTful アプリケーション内において、ある決まった処理を簡単に実装することができるようになります。 今回は サンプル として「フィルターを実装したアクション(メソッド)のレスポンスをキャッシュさせない」独自フィルターを作成します。

目次

独自フィルター の 実装手順

  1. 独自フィルター 用 の クラス を追加すます。
    ここでは、Filter フォルダー を作成した後、 右クリック-[追加]-[新しい項目] を選択します。
  2. [コードファイル] を選択し、 NoCacheFilterAttribute を作成します。
  3. System.Web.Http.Filters.ActionFilterAttribute を継承します。
    public class NoCacheFilterAttribute : System.Web.Http.Filters.ActionFilterAttribute
    
  4. .OnActionExecuting メソッド を オーバーライドします。
    public override void OnActionExecuting (HttpActionContext actionContext)
    {
        base.OnActionExecuting(actionContext);
    }
    
  5. .OnActionExecuted メソッド を オーバーライドします。
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        base.OnActionExecuted(actionExecutedContext);
    }
    

独自フィルター の 実装例

NoCacheFilterAttribute.cs

using System.Net.Http.Headers;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;

/// <summary>
/// キャッシュ無効化するフィルター属性
/// </summary>
public class NoCacheFilterAttribute : ActionFilterAttribute
{
    /// <summary>
    /// アクション メソッドの呼び出し前に発生します。
    /// </summary>
    /// <param name="actionContext">アクション実行コンテキスト。</param>
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        base.OnActionExecuting(actionContext);
    }
    
    /// <summary>
    /// アクション メソッドの呼び出し後に発生します。
    /// </summary>
    /// <param name="actionExecutedContext">アクション実行コンテキスト。</param>
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        var response = actionExecutedContext.Response;

        response.Headers.CacheControl = new CacheControlHeaderValue()
        {
            NoCache = true
        };

        base.OnActionExecuted(actionExecutedContext);
    }
}

独自フィルター の 利用

CatalogController.cs

public class CatalogController : ApiController
{
    // GET api/catalog/
    [NoCacheFilter]
    public IEnumerable<string> Get()
    {
        // 商品一覧を取得する処理を記述...

        return new string[] { "鉛筆", "ボールペン", "消しゴム" };
    }
}

今回、以下のサイトを参考にしました。