ASP.NET Coreアプリケーションにおいて、ミドルウェアはリクエスト処理の中心的な役割を果たします。この記事では、ミドルウェアの基本概念から、独自のミドルウェアを作成する方法まで解説します。
技術準備
まず、以下のコマンドで新しいASP.NET Coreプロジェクトを作成し、Visual Studio Codeで開きます:
dotnet new web -n CustomMiddlewareDemo -o CustomMiddlewareDemo
cd CustomMiddlewareDemo
code .
ミドルウェアの基礎
ミドルウェアは、リクエストパイプラインの各段階で処理を行うコードブロックです。次のような例で、シンプルなミドルウェアを定義できます:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Use(async (context, next) => {
await context.Response.WriteAsync("Start ");
await next();
await context.Response.WriteAsync(" End");
});
app.Run(async context => {
await context.Response.WriteAsync("Hello World!");
});
app.Run();
カスタムミドルウェアの作成
例えば、リクエストの実行時間を計測するミドルウェアを作成します:
using System.Diagnostics;
public class TimerMiddleware {
private readonly RequestDelegate _next;
public TimerMiddleware(RequestDelegate next) {
_next = next;
}
public async Task InvokeAsync(HttpContext context) {
var stopwatch = new Stopwatch();
stopwatch.Start();
await _next(context);
stopwatch.Stop();
await context.Response.WriteAsync($"Time: {stopwatch.ElapsedMilliseconds} ms.");
}
}
このミドルウェアを使用するためには、以下のように追加します:
app.UseMiddleware<TimerMiddleware>();
ミドルウェアの応用
条件付きパイプラインの作成
特定の条件に基づいてパイプラインを分岐させることも可能です。例えば、URLパラメータに基づいて動作を変える場合:
app.MapWhen(context => context.Request.Query.ContainsKey("branch"), appBranch => {
appBranch.Run(async context => {
await context.Response.WriteAsync("Branch Test");
});
});
終了ミドルウェアの使用
終了ミドルウェアは、特定のルートにアクセスした際に特別な処理を行います。以下はその一例です:
public class StatusMiddleware {
private readonly RequestDelegate _next;
private string _status;
public StatusMiddleware(RequestDelegate next, string status) {
_next = next;
_status = status;
}
public async Task InvokeAsync(HttpContext context) {
await context.Response.WriteAsync($"App Status: {_status}");
}
}
public static class StatusMiddlewareExtensions {
public static IEndpointRouteBuilder MapStatus(this IEndpointRouteBuilder routes, string pattern, string status) {
var pipeline = routes.CreateApplicationBuilder().UseMiddleware<StatusMiddleware>(status).Build();
return routes.Map(pattern, pipeline).WithDisplayName("Status Middleware");
}
}
これにより、`/status`ルートにアクセスするとアプリケーションのステータスが表示されます。