web-dev-qa-db-ja.com

ASP.NET Web APIを使用したエラー処理のベストプラクティス

Web APIエラー管理のベストプラクティスを明確にしてください。実際、Apiリクエストにtry catchを使用するのが良い習慣かどうかわかりません。

public Vb.Order PostOrderItem(Vb.Order order)
{
    if (OAuth.isValid(Request.Headers.GetValues("Token").Single()) != true)
    {
        HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.Unauthorized);
        throw new HttpResponseException(httpResponseMessage);
    }
    if (!ModelState.IsValid)
    {
        HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.BadRequest);
        throw new HttpResponseException(httpResponseMessage);
    }

    try
    {
        return Vb.Document.Generate(order);
    }
    catch (Exception ex)
    {
        logger.Error(ex);
        HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.BadRequest);
        httpResponseMessage.Content = new StringContent(ex.Message);
        throw new HttpResponseException(httpResponseMessage);
    }

}

サーバー側のコードにtry catchを使用することは、例外を再スローしてcatchを記録するだけなので、良い方法ではありません。

22

Web APIのエラー処理は分野横断的な懸念事項であると考えられており、開発者が分野横断的な懸念事項に集中する必要がないように、パイプラインのどこかに配置する必要があります。

ASP.NET Web APIの例外処理 を読む必要があります

Web APIコントローラーがキャッチされない例外をスローするとどうなりますか?デフォルトでは、ほとんどの例外は、ステータスコード500、Internal Server ErrorのHTTP応答に変換されます。

および ASP.NET Web API 2のグローバルエラー処理

コントローラーをできるだけ無駄のない状態に保つようにしてください。元のコードのようなエラー処理は、コードの重複、および開発者が気にする必要のない不必要な懸念のみをもたらします。開発者は、横断的な関心事ではなく、中核的な関心事に焦点を当てるべきです。コアの懸念に注目するだけで、上記のコードは次のようになります。

[MyAuthentication]
[MyValidateModel]
public Vb.Order PostOrderItem(Vb.Order order)
{    
    return Vb.Document.Generate(order);
}

なぜそんなに無駄のない?

なぜなら:

if (OAuth.isValid(Request.Headers.GetValues("Token").Single()) != true)
{
    HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.Unauthorized);
    throw new HttpResponseException(httpResponseMessage);
}

ASP.NET Web API 2の認証フィルター に移動できます。これは、コントローラー/アクションでローカルに適用するか、関連する応答を返すためにグローバルに適用できます。

ASP.NET Web APIのモデル検証 このように

if (!ModelState.IsValid)
{
    HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.BadRequest);
    throw new HttpResponseException(httpResponseMessage);
}

次のようなフィルタに移動することもできます:。

public class MyValidateModelAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (!actionContext.ModelState.IsValid)
        {
            actionContext.Response = actionContext.Request.CreateErrorResponse(
                HttpStatusCode.BadRequest, actionContext.ModelState);
        }
    }
}
36
Nkosi

このリンクを参照してください ASP.NET Web APIの例外処理-ガイド付きツアー 。 4レベルの例外処理パイプラインがあります。

  • レベル1-HttpResponseException
  • レベル2-例外フィルター
  • レベル3-ロギング
  • レベル4-例外ハンドラー

Web APIを使用すると、例外処理に関して非常に柔軟に対応できます。要点をまとめると:

  • アクションレベルで未処理の例外を処理するには、HttpResponseExceptionまたはショートカットメソッドを使用します。
  • 例外フィルターを使用して、複数のアクションとコントローラーで特定の未処理の例外を処理します。
  • ExceptionLoggerを使用して、未処理の例外をログに記録します。
  • 例外ハンドラ(アプリケーションごとに1つ)を使用して、アプリケーション全体で未処理の例外を処理します。
22
Phuc Thai

いくつかのメソッドがあり、それぞれが論理オブジェクトグラフをさらに一歩進めます。

この記事ではそれらをすべてリストします。 http://www.codeproject.com/Articles/850062/Exception-handling-in-ASP-NET-MVC-methods-explaine

コードの重複を避けるために、より高いレベルのメソッドの1つを使用すると便利です。

0
Milney