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

ASP.NET Web API(C#)のパイプラインにカスタムメッセージハンドラーを追加する方法

ASP.NET Web APIでサーバーサイドのカスタムHTTPメッセージハンドラーを作成するには、System.Net.Http.DelegatingHandlerクラスを継承したクラスを作成する必要があります。メッセージハンドラーを活用することで、リクエストがコントローラーに到達する前や、レスポンスがクライアントに返される前に、共通の処理を挟み込むことができます。

以下の手順で、カスタムメッセージハンドラーを実装していきましょう。

ステップ1:コントローラーとアクションメソッドを作成する

まずは、APIの動作確認用として、コントローラーとそれに対応するアクションメソッドを作成します。

コード例

using DemoWebApplication.Models;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;

namespace DemoWebApplication.Controllers
{
    public class StudentController : ApiController
    {
        List<Student> students = new List<Student>{
            new Student{
                Id = 1,
                Name = "Mark"
            },
            new Student{
                Id = 2,
                Name = "John"
            }
        };

        public IEnumerable<Student> Get()
        {
            return students;
        }

        public Student Get(int id)
        {
            var studentForId = students.FirstOrDefault(x => x.Id == id);
            return studentForId;
        }
    }
}

ステップ2:CustomMessageHandlerクラスを作成する

次に、独自のカスタムメッセージハンドラークラス「CustomMessageHandler」を作成します。

コード例

using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

namespace DemoWebApplication
{
    public class CustomMessageHandler : DelegatingHandler
    {
        protected async override Task<HttpResponseMessage>
            SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            var response = new HttpResponseMessage(HttpStatusCode.OK){
                Content = new StringContent("Result through custom message handler..")
            };

            var taskCompletionSource = new
                TaskCompletionSource<HttpResponseMessage>();
            taskCompletionSource.SetResult(response);

            return await taskCompletionSource.Task;
        }
    }
}

ここでは、DelegatingHandlerを継承したCustomMessageHandlerクラスを宣言し、その中でSendAsync()メソッドをオーバーライドしています。

この実装のポイントは、HTTPリクエストが到着するとCustomMessageHandlerが実行され、リクエストをそれ以上処理せずに、自らHTTPレスポンスメッセージを生成して返すという点です。つまり、すべてのHTTPリクエストが上位層(コントローラーのアクションメソッドなど)に到達する前に、このハンドラーで処理が完結してしまう仕組みになっています。

実際の開発では、この仕組みを応用して認証・認可チェック、ログ記録、レスポンスヘッダーの付与といった横断的な処理を実装することが一般的です。上記の例のようにTaskCompletionSourceを使って即座にレスポンスを返すこともできますし、base.SendAsync()を呼び出してパイプラインの次のハンドラーへ処理を委譲することも可能です。

ステップ3:Global.asaxにハンドラーを登録する

作成したCustomMessageHandlerを、Global.asaxクラスでグローバル構成に登録します。

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
        GlobalConfiguration.Configuration.MessageHandlers.Add(new
            CustomMessageHandler());
    }
}

MessageHandlers.Add()メソッドを使うことで、作成したハンドラーがWeb APIのメッセージ処理パイプラインに組み込まれます。複数のハンドラーを登録した場合、追加された順序に従ってリクエストが処理される点にも注意してください。

ステップ4:アプリケーションを実行してURLにアクセスする

アプリケーションを実行し、ブラウザからAPIのURLにアクセスしてみましょう。

ASP.NET Web API(C#)のパイプラインにカスタムメッセージハンドラーを追加する方法

上記の出力結果を見ると、CustomMessageHandlerクラス内で設定したメッセージが表示されていることがわかります。これは、HTTPリクエストがGet()アクションメソッドに到達する前に、CustomMessageHandlerによって処理され、レスポンスが返されたことを意味しています。

このように、DelegatingHandlerを継承したカスタムメッセージハンドラーを登録するだけで、ASP.NET Web APIのリクエスト/レスポンスパイプラインに独自の処理を簡単に組み込むことができます。

  1. C# ASP.NET Web APIのフィルターの種類と使い方を徹底解説

    ASP.NET Web APIフレームワークでは、リクエスト処理のさまざまな段階に追加のロジックを組み込むために「フィルター」が使用されます。フィルターは、ロギング、認可、キャッシュといった横断的関心事(クロスカッティングコンサーン)を実装するための仕組みであり、アクションメソッドやコントローラーに対して、宣言的またはプログラム的に適用できます。ここでは、C#のWeb APIで利用できる主なフィルターの種類について詳しく見ていきましょう。Web APIの主なフィルターの種類1. 認証フィルター(Authentication Filter)認証フィルターは、ユーザーの身元情報を検証するために使用

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

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