Asp.Net Web API 例外処理エクスペリエンスの概要

PHPz
リリース: 2017-04-04 15:44:57
オリジナル
2482 人が閲覧しました

前回のチュートリアルでは、Web API でのフィルターの開発と使用について紹介しました ExceptionFilter について話したときに、落とし穴がありました。それは、ExceptionFilter は、Action の実行中に発生する例外のみをインターセプトして処理できるということです。アクション、例外が発生した場合、ExceptionFilter は無力です。

これらの例外には以下が含まれます:

1. コントローラー構築メソッドの例外

2. MessageHandler の例外

3. ルーティングプロセスの例外

4. シリアル化/逆シリアル化プロセスの本体 発生する例外

ExceptionFilter は、ApiControler が正常にインスタンス化された後、および Action の実行中に発生する例外のみを解決できることがわかります。この問題を解決するために、ExceptionFilter に加えて、2 つの例外レコードも WEB API 処理拡張ポイントに導入されています。

IExceptionLogger と IExceptionHandler。 Aut Out Out Out AuttromancePsumbletherecement Basion fight nimb nigh out onime night Out night Out night on not now of to now out's '' '' '' '' '' '' '' '' -to-a-points は

に戻ります。 Web API フレームワークのライフ サイクルでは、リクエスト サイクルでキャッチまたは処理されなかった例外は、まず例外ログ記録のために例外ログ パイプラインに入ります。複数の IExceptionLogger インスタンスを Web に登録できます。担当する API が異なる例外処理。

IExceptionHandler は、例外処理コンポーネントとして、例外発生後の処理を担当します。これは、IExceptionLogger コンポーネントが記録を完了し、例外処理に関連する ExceptoinFilter が存在しない場合に実行されます。 Web API では、例外処理用の ExceptionHandler が 1 つだけ存在します。 I Web API フレームワークでは、ExceptionLogger と ExceptionHandler という 2 つの基本クラスが作成されます。ExceptionLogger の基本クラスを使用すると、同じ ExceptionLogger インスタンスが繰り返し記録されます (たとえば、後続の例外がスローされた場合など)。パイプライン、または同じ ExceptionLogger オブジェクトが誤って 2 回登録された場合、記録が繰り返される可能性があります) ShouldLog メソッドをオーバーライドし、独自の例外レコード判定ロジックを追加して、さまざまなシナリオに対して異なる ExceptionLogger 呼び出しを行うこともできます。興味があれば、ExceptionLogger 基本クラスを逆コンパイルして、非常に興味深い手法である表示インターフェイスの実装を使用していることを確認してください。 ExceptionLogger の使用例を見てみましょう:

    public class ErroLogger : ExceptionLogger
    {        public  async Task LogAsync(ExceptionLoggerContext context, CancellationToken cancellationToken)
        {            var sb = new StringBuilder();            //获取Log组件
            ILogger log = LogManager.GetCurrentClassLogger();            var request = context.Request;

            sb.AppendLine("URL:");            //获取URL
            var url = request.RequestUri.ToString();
            sb.AppendLine(url);
           
            log.Error(context.Exception,sb.ToString(),"");
        }        public override bool ShouldLog(ExceptionLoggerContext context)
        {            return context.Exception is DemoException && base.ShouldLog(context);
        }
    }
ログイン後にコピー

この例では、この ExceptionLogger が DemoException 型の例外のみを記録するように ShouldLog を書き直し、また、基本クラスのメソッドを呼び出して、それが記録されないことを確認します。同じ例外が繰り返しログに記録されます。 LogAsync メソッドでは、Log コンポーネントを介して例外の原因となった要求 URL を記録し、例外情報も記録しました。

次に、このコンポーネントを登録する必要があります。

App_Start/WebApiConfig.cs ファイルの Register メソッドに

config.Services.Add(typeof(IExceptionLogger),new ErroLogger());
ログイン後にコピー

を書き込みます。このようにして、DemoException の例外記録コンポーネントが開発され、登録されます。 Web API 実行パイプラインで未処理の DemoException が発生すると、それを記録するためにコンポーネントが呼び出されます。

次に、ExceptionHandler を作成します。Web API フレームワーク全体で、ExceptionHandler は ExceptionLogger と同様に ExceptionHandler 基本クラスを継承して、例外処理を簡素化することができます。例外は、パイプライン内の他のリンクによって繰り返しスローされた例外を繰り返し処理しないように処理する必要があります。例も提供します:

    public class ErrorHandler : ExceptionHandler
    {        public override async Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)
        {            if (context.Exception is DemoException)
            {
                context.Result = new ResponseMessageResult(context.Request.CreateResponse(HttpStatusCode.BadRequest,new {Message=context.Exception.Message}));
            }            else
            {
                context.Result = new ResponseMessageResult(context.Request.CreateResponse(HttpStatusCode.InternalServerError,new {Message = "服务器已被外星人绑架"}));
            }
        }
}
ログイン後にコピー

この例では、例外のタイプを決定し、異なる例外に基づいて異なる応答内容と異なる HTTP ステータス コードをクライアントに返します。

次に、この例外処理モジュールを構成に登録し、App_Start/WebApiConfig.cs ファイルの Register メソッドに

config.Services.Replace(typeof(IExceptionHandler),new ErrorHandler());
ログイン後にコピー

を書き込みます。これにより、システムのデフォルトの ExceptionHandler が置き換えられ、カスタム ハンドラーを使用して例外を処理できます。処理済みです。

例外の記録と処理のプロセス中に、このパラメータを使用して現在のリクエストのコンテキストを取得したり、リクエストやレスポンスを取得したりすることができます (空になる場合もあるので注意してください)。例外をキャプチャする catch ブロック情報やその他のコンテンツをキャプチャすると、この情報を使用して例外をより適切に説明、記録、処理することができます。

この時点で、ExceptionLogger コンポーネントと ExceptionHandler コンポーネントの簡単な開発が完了しました。開発プロセス中に、ExceptionLogger がグローバル例外記録を担当し、Web API フレームワーク パイプラインで発生する未処理の例外をキャプチャして記録することがわかります。 ExceptionHandler と ExceptionFilter の機能は重複しています。どのような場合に ExceptionHandler を使用し、どのような場合に ExceptionFilter を使用するのでしょうか? 2 つの違いを次の表に示します。

スコープ、機能条件 utrontrollerのインスタンス化の成功後、Webapi

コントローラー

アクション

グローバル

インスタンス数

無制限 世界的にユニークな

fulterLoadingを成功させた後、上記の表から、処理粒度がコントローラーと同じくらい詳細である場合、アクション レベルの ExceptionFilter は、すでに特定のアクションを正確に特定できるため、現在のアクションに対してカスタマイズされた開発を行うことができます。 ExceptionHandler のスコープは ExceptionFilter のスコープよりもはるかに大きく、グローバルな状況を処理する上でより多くの利点があります。

Web API の例外処理について説明します。記事に間違いや質問がある場合は、ご指摘ください。

以上がAsp.Net Web API 例外処理エクスペリエンスの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート