こんにちは、サイオステクノロジー技術部 武井です。今回は、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^)