C#
 Computer >> コンピューター >  >> プログラミング >> C#

C# ASP.NET Coreのカスタムミドルウェアでエラー(例外)を処理する方法

はじめに

ASP.NET Coreアプリケーションでは、例外処理を一元管理するためにカスタムミドルウェアを活用するのが効果的です。本記事では、独自の例外処理ミドルウェア「ExceptionMiddleware」を実装し、発生した例外をキャッチして統一されたJSON形式のエラーレスポンスを返す方法を解説します。

1. カスタム例外ミドルウェアの作成

まず、「CustomExceptionMiddleware」という名前の新しいフォルダを作成し、その中に「ExceptionMiddleware.cs」クラスを作成します。

依存性注入によるサービスの登録

最初に行うべきは、ILoggerManagerサービスとRequestDelegateを依存性注入(DI)を通じて登録することです。

RequestDelegate型の_nextパラメータは、HTTPリクエストを処理できる関数デリゲートです。パイプライン内の次のコンポーネントへリクエストを受け渡す役割を担います。

InvokeAsync() メソッドの作成

登録処理が完了したら、InvokeAsync()メソッドを作成する必要があります。このメソッドがないと、RequestDelegateはリクエストを処理できません。

通常であれば、_nextデリゲートがリクエストを処理し、コントローラーのGetアクションが正常なレスポンスを生成します。しかし、リクエストが失敗した場合(今回は意図的に例外を発生させているため必ず失敗します)、ミドルウェアはcatchブロックをトリガーし、HandleExceptionAsyncメソッドを呼び出します。

public class ExceptionMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILoggerManager _logger;

    public ExceptionMiddleware(RequestDelegate next, ILoggerManager logger)
    {
        _logger = logger;
        _next = next;
    }

    public async Task InvokeAsync(HttpContext httpContext)
    {
        try
        {
            await _next(httpContext);
        }
        catch (Exception ex)
        {
            _logger.LogError($"Something went wrong: {ex}");
            await HandleExceptionAsync(httpContext, ex);
        }
    }

    private Task HandleExceptionAsync(HttpContext context, Exception exception)
    {
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;

        return context.Response.WriteAsync(new ErrorDetails()
        {
            StatusCode = context.Response.StatusCode,
            Message = "Internal Server Error from the custom middleware."
        }.ToString());
    }
}

このコードのポイントは以下の通りです。

  • try-catch構文: パイプライン全体の処理をtryブロックでラップし、どこかで例外が発生すれば確実にキャッチできます。
  • ログ記録: _logger.LogError()により、例外の詳細をログに出力し、障害調査に役立てられます。
  • 統一されたレスポンス: HandleExceptionAsyncメソッドが、ステータスコード500(Internal Server Error)とJSON形式のエラー詳細をクライアントに返します。

2. 拡張メソッドの追加

次に、ExceptionMiddlewareExtensionsクラスに、以下のような静的メソッドを追加します。

public static void ConfigureCustomExceptionMiddleware(this IApplicationBuilder app)
{
    app.UseMiddleware<ExceptionMiddleware>();
}

この拡張メソッドを作成しておくことで、ミドルウェアの登録処理を簡潔かつ再利用可能な形にできます。

3. Startupクラスでの登録

最後に、このメソッドをStartupクラスのConfigureメソッド内で呼び出します。

app.ConfigureCustomExceptionMiddleware();

これで、アプリケーションのリクエストパイプラインにカスタム例外ミドルウェアが組み込まれ、すべての未処理例外を一括してハンドリングできるようになります。

まとめ

カスタムミドルウェアによる例外処理を導入すると、コントローラーやサービス層に散在しがちなtry-catch文を削減でき、エラーレスポンスの形式も統一されます。結果として、コードの保守性が向上し、クライアント側でも一貫したエラーハンドリングが可能になります。ぜひ実際のプロジェクトに取り入れてみてください。

  1. C# ASP.NET Web APIでURIを使ったバージョニングを実装する方法

    Web APIサービスを公開すると、さまざまなクライアントアプリケーションがそのサービスを利用し始めます。ビジネスの成長や要件の変化に伴い、サービス側にも変更が必要になる場面がありますが、その変更は既存のクライアントアプリケーションを壊さない形で行わなければなりません。こうした課題を解決するのが「Web APIのバージョニング」です。既存のサービスはそのまま維持して既存クライアントへの影響を避けつつ、新しいクライアントアプリケーション向けに新バージョンのサービスを提供できるようになります。バージョニングを実装する方法のひとつが、URIにバージョン情報を含めるアプローチです。以下に具体的な実装例

  2. C# ASP.NET WebAPIでCORSの問題を解決する方法を徹底解説

    CORS(クロスオリジンリソースシェアリング)とはクロスオリジンリソースシェアリング(Cross-Origin Resource Sharing:CORS)は、追加のHTTPヘッダーを使用して、あるオリジンで動作しているWebアプリケーションに対し、別のオリジンにある選択されたリソースへのアクセスを許可するようブラウザに指示する仕組みです。Webアプリケーションは、自身とは異なるオリジン(ドメイン、プロトコル、ポート)のリソースを要求する際に、クロスオリジンHTTPリクエストを実行します。例として、フロントエンド(UI)とバックエンド(サービス)を持つアプリケーションを考えてみましょう。フロン