ASP.NET 6.0のカスタムミドルウェア実装ガイド

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`ルートにアクセスするとアプリケーションのステータスが表示されます。

タグ: ASP.NET Core C# ミドルウェア パイプライン カスタマイズ

6月10日 19:37 投稿