ASP.NET WebAPIでエラーを処理する方法

MicrosoftのASP.NETWeb APIは、HTTP上で実行されるステートレスRESTfulサービスを構築するために使用できる軽量のフレームワークです。例外は実行時に発生するエラーであり、例外処理はアプリケーションコードの実行時エラーを処理する手法です。

すべてのASP.NETWeb API開発者は、Web APIで例外を処理する方法と、WebAPIコントローラーメソッドから適切なエラーコードとエラーメッセージを送信する方法を知っている必要があります。以下のセクションでは、これらのタスクを実行する方法を検討します。 

ASP.NET WebAPIでのHttpResponseExceptionの使用

HttpResponseExceptionクラスを使用して、WebAPIのコントローラーメソッドから特定のHTTPステータスコードとメッセージを返すことができます。これが例です。

public Employee GetEmployee(int id)

{{

    従業員emp = employeeRepository.Get(id);

    if(emp == null)

    {{

        var response = new HttpResponseMessage(HttpStatusCode.NotFound)

        {{

            Content = new StringContent( "従業員は存在しません"、System.Text.Encoding.UTF8、 "text / plain")、

            StatusCode = HttpStatusCode.NotFound

        }

        新しいHttpResponseException(response);をスローします。

    }

    empを返す;

}

Web APIがIHttpActionResultを返す場合は、以下に示すようにGetEmployeeメソッドを記述できます。

public IHttpActionResult GetEmployee(int id)

{{

    従業員emp = employeeRepository.Get(id);

    if(emp == null)

    {{

        var response = new HttpResponseMessage(HttpStatusCode.NotFound)

        {{

            Content = new StringContent( "従業員は存在しません"、System.Text.Encoding.UTF8、 "text / plain")、

            StatusCode = HttpStatusCode.NotFound

        }

        新しいHttpResponseException(response);をスローします。

    }

    Ok(emp);を返します。

}

エラーコードとエラーメッセージは応答オブジェクトに割り当てられ、WebAPIコントローラーのアクションメソッドで例外が発生するとHttpResponseExceptionのインスタンスが返されることに注意してください。

ASP.NET WebAPIでのHttpErrorの使用

Web APIコントローラーメソッドのCreateErrorResponse拡張メソッドを使用して、意味のあるエラーコードとエラーメッセージを返すことができます。CreateErrorResponseメソッドはHttpErrorオブジェクトを作成し、それをHttpResponseMessageオブジェクト内にラップすることに注意してください。

次のコードリストは、WebAPIコントローラーのアクションメソッドからCreateErrorResponse拡張メソッドを使用する方法を示しています。

public IActionResult GetEmployee(int id)

{{

    従業員emp = employeeRepository.Get(id);

    if(emp == null)

    {{

       string message = "従​​業員は存在しません";

        新しいHttpResponseException(をスローします

            Request.CreateErrorResponse(HttpStatusCode.NotFound、message));

    }

    Ok(emp);を返します。

}

上記のGetEmployee()メソッドを参照してください。このメソッドは、パラメーターとして従業員IDを受け入れ、このIDを使用して、従業員リポジトリインスタンスを使用して従業員レコードを検索および取得します。指定された従業員IDを持つ従業員レコードが見つからない場合、HttpResponseExceptionのインスタンスがスローされます。Web APIコントローラーメソッドから例外インスタンスがスローされる前に、適切なエラーメッセージとエラーコードがどのように作成されるかに注意してください。

ASP.NET WebAPIで例外フィルターを使用する

例外フィルターは、WebAPIコントローラーメソッドで生成された未処理の例外を処理するために使用できるフィルターです。つまり、例外フィルターを使用して、コントローラーメソッドから発生するWebAPIの未処理の例外をキャッチできます。未処理の例外がスローされ、コントローラーメソッドで処理されない場合、グローバルエラーフィルターはWebAPIで例外を処理するための優れたアプローチであることに注意してください。

例外フィルターを作成するには、IExceptionFilterインターフェースを実装する必要があります。抽象クラスExceptionFilterAttributeを拡張してから、OnExceptionメソッドをオーバーライドすることにより、例外フィルターを作成することもできます。ExceptionFilterAttribute抽象クラスがIExceptionFilterインターフェイスを実装することに注意してください。

次のコードスニペットは、ExceptionFilterAttributeクラスを拡張し、OnExceptionメソッドをオーバーライドすることにより、カスタム例外フィルターを作成する方法を示しています。コントローラメソッドによってスローされた標準例外がカスタム例外フィルタによってキャプチャされ、適切なHttpStatusCodeを使用してHttpStatusResponseオブジェクトに変換される方法に注意してください。

パブリッククラスCustomExceptionFilter:ExceptionFilterAttribute

    {{

        public override void OnException(HttpActionExecutedContext actionExecutedContext)

        {{

            HttpStatusCode status = HttpStatusCode.InternalServerError;

            文字列メッセージ= String.Empty;

            var exceptionType = actionExecutedContext.Exception.GetType();

            if(exceptionType == typeof(UnauthorizedAccessException))

            {{

                message = "WebAPIへのアクセスは許可されていません。";

                status = HttpStatusCode.Unauthorized;

            }

            else if(exceptionType == typeof(DivideByZeroException))

            {{

                メッセージ= "内部サーバーエラー。";

                status = HttpStatusCode.InternalServerError;

            }

            そうしないと

            {{

                メッセージ= "見つかりません。";

                status = HttpStatusCode.NotFound;

            }

            actionExecutedContext.Response = new HttpResponseMessage()

            {{

                Content = new StringContent(message、System.Text.Encoding.UTF8、 "text / plain")、

                StatusCode = status

            };

            base.OnException(actionExecutedContext);

        }

    }

カスタム例外フィルターをHttpConfigurationオブジェクトのfiltersコレクションに追加する必要があります。

public static void Register(HttpConfiguration config)

        {{

            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(

                名前: "DefaultApi"、

                routeTemplate: "api / {controller} / {id}"、

                デフォルト:new {id = RouteParameter.Optional}

            );

            config.Formatters.Remove(config.Formatters.XmlFormatter);

            config.Filters.Add(new CustomExceptionFilter());

        }

次の3つの方法のいずれかで例外フィルターを登録できます。

  • アクションレベルで
  • コントローラレベルで
  • グローバルに

次のコードスニペットは、アクションレベルで、つまりコントローラーのアクションメソッドにフィルターを適用する方法を示しています。

パブリッククラスEmployeesController:ApiController

{{

    [NotImplementedExceptionFilter]

    public Employee GetEmployee(int id)

    {{

        新しいNotImplementedException();をスローします。

    }

}

コントローラレベルで例外フィルタを適用するには、次に示すように、クラスレベルでfilter属性を使用する必要があります。

[DatabaseExceptionFilter]

パブリッククラスEmployeesController:ApiController

{{

    //いくつかのコード

}

カスタム例外フィルターをグローバルに適用して、すべてのWebAPIコントローラーで機能するようにすることもできます。これを行う方法は次のとおりです。

GlobalConfiguration.Configuration.Filters.Add(new DatabaseExceptionFilterAttribute());

次のコードスニペットは、前に作成したカスタム例外フィルターをコントローラーメソッドに適用する方法を示しています。

[CustomExceptionFilter]

 public IEnumerable Get()

 {{

    新しいDivideByZeroException();をスローします。 

 }

ASP.NET Web APIは、HttpResponseExceptionの使用をサポートして、コントローラーレベルとアクションレベルの両方で例外を処理します。Web APIのアクションメソッドがキャッチされない例外をスローすると、例外はHTTPステータスコード500、つまり「内部サーバーエラー」に変換されます。HttpResponseExceptionを使用する場合は、HttpResponseExceptionクラスのコンストラクターで返すステータスコードを指定できます。このようにして、エラーコードをカスタマイズして、より意味のあるものにすることができます。

ASP.NETおよびASP.NETCoreでさらに多くのことを行う方法:

  • ASP.NETCoreでメモリ内キャッシュを使用する方法
  • ASP.NET WebAPIでエラーを処理する方法
  • 複数のパラメーターをWebAPIコントローラーメソッドに渡す方法
  • ASP.NET WebAPIで要求と応答のメタデータをログに記録する方法
  • ASP.NETでHttpModuleを操作する方法
  • ASP.NET Core WebAPIの高度なバージョン管理
  • ASP.NETCoreで依存性注入を使用する方法
  • ASP.NETでセッションを操作する方法
  • ASP.NETでHTTPHandlerを操作する方法
  • ASP.NETCoreでIHostedServiceを使用する方法
  • ASP.NETCoreでWCFSOAPサービスを利用する方法
  • ASP.NETCoreアプリケーションのパフォーマンスを向上させる方法
  • RestSharpを使用してASP.NETCore WebAPIを使用する方法
  • ASP.NETCoreでのログインの操作方法
  • ASP.NETCoreでMediatRを使用する方法
  • ASP.NETCoreでセッション状態を操作する方法
  • ASP.NETCoreでナンシーを使用する方法
  • ASP.NET WebAPIのパラメーターバインディングを理解する
  • ASP.NET CoreMVCでファイルをアップロードする方法
  • ASP.NET Core WebAPIでグローバル例外処理を実装する方法
  • ASP.NETCoreでヘルスチェックを実装する方法
  • ASP.NETでのキャッシュのベストプラクティス
  • .NETでApacheKafkaメッセージングを使用する方法
  • WebAPIでCORSを有効にする方法
  • WebClientとHttpClientとHttpWebRequestをいつ使用するか
  • .NETでRedisキャッシュを操作する方法
  • .NETでTask.WaitAllとTask.WhenAllを使用する場合