ASP.NET Coreのカスタムミドルウェア

こんにちは、サイオステクノロジー技術部 武井です。今回は、ASP.NET Coreでカスタムミドルウェアを作成したいと思います。

カスタムミドルウェアとは

ミドルウェアについては、こちらの記事にて、お話致しました通りです。カスタムミドルウェアとは、このミドルウェアを独立したクラスとして作成し、呼び出しやメンテナンス等を簡単にしたものになります。

カスタムミドルウェアのクラスには以下のルールがあります。

  • コンストラクタにMicrosoft.AspNetCore.Http.ReuqestDelegate型の引数を取ること。
  • 戻り値がSystem.Threading.Tasks.Task型、引数にMicrosoft.AspNetCore.Http.HttpContext型を持つInvokeという名前のメソッドを持つこと

とりあえずソースコードを見てみることとしましょう

ソースコード

以下の要件を満たすカスタムミドルウェアを作成してみます。

HTTPリクエストの処理開始前と処理終了後にログを出力する。

ソースコードは以下のとおりです。

public class LoggingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<LoggingMiddleware> _logger;

    // コンストラクタにRequestDelegate型の引数を取っています。
    // ログに出力するので、ILoggerインターフェースも引数に取ります。
    // loggerにログの実装がDIされます。
    public LoggingMiddleware(RequestDelegate next, ILogger<LoggingMiddleware> logger)
    {   
        _next = next;
        _logger = logger;
    }   

    // ミドルウェアの実行メソッドです。
    public async Task Invoke(HttpContext httpsContext)
    {   
        this._logger.LogInformation("処理開始:" + httpsContext.Request.Path);
        // 次のミドルウェアが呼ばれます。その前後で、処理開始、処理終了のログを出力しています。
        await _next(httpsContext);
        this._logger.LogInformation("処理終了"); 
    }   
}

// ミドルウェアの呼び出しを簡単にする拡張メソッドです。
// IApplicationBuilderを拡張しています。
public static class LoggingMiddlewareExtensions
{
    public static IApplicationBuilder UseLoggingMiddleware(this IApplicationBuilder builder)
    {   
        // IApplicationBuilderインターフェースのUseMiddlewareメソッドの
        // ジェネリック型に、作成したミドルウェアのクラス型を指定すれば、
        // ミドルウェアの登録は完了です。
        return builder.UseMiddleware<LoggingMiddleware>();
    }   
}

 

呼び出すときはStartupクラスのConfigureメソッドで、先程拡張したメソッドを以下のよう呼び出します。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    // 先程拡張したメソッドを呼び出しています。
    // app.UseMiddleware<LoggingMiddleware>();と同義です。
    app.UseLoggingMiddleware();

    app.Run(async (context) =>
    {
        await context.Response.WriteAsync("Hello World!");
    });
}

 

実行結果は以下のとおりです。

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET https://localhost:5001/
info: CustomMiddleware.LoggingMiddleware[0]
      処理開始:/
info: CustomMiddleware.LoggingMiddleware[0]
      処理終了
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 65.7437ms 200

まとめ

もうカスタムミドルウェアのとりこ(^o^)

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

2人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です