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

◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
【5/21開催】Azure OpenAI ServiceによるRAG実装ガイドを公開しました
生成AIを活用したユースケースで最も一番熱いと言われているRAGの実装ガイドを公開しました。そのガイドの紹介をおこなうイベントです!!
https://tech-lab.connpass.com/event/315703/

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

アバター画像
About 武井 宜行 269 Articles
Microsoft MVP for Azure🌟「最新の技術を楽しくわかりやすく」をモットーにブログtech-lab.sios.jp)で情報を発信🎤得意分野はAzureによるクラウドネイティブな開発(Javaなど)💻「世界一わかりみの深いクラウドネイティブ on Azure」の動画を配信中📹 https://t.co/OMaJYb3pRN
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

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

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


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる