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

