Asp.Netコアウェブアピグローバル例外ミドルウェア

ミドルウェアは、例外収集システムの異常を扱うことができます

1、取扱アド例外ミドルウェアAppExceptionHandlerMiddleware

  パブリック クラスAppExceptionHandlerMiddleware 
    { 
        プライベート 読み取り専用RequestDelegate _next。
        プライベート AppExceptionHandlerOptionの_option = 新しいAppExceptionHandlerOption();
        プライベート 読み取り専用のIDictionary < int型文字列 > _exceptionStatusCodeDic。
        プライベート 読み取り専用 ILoggerです<AppExceptionHandlerMiddleware> _logger。
        公共 AppExceptionHandlerMiddleware(RequestDelegate次に、アクション<AppExceptionHandlerOption> actionOptions、ILoggerです<AppExceptionHandlerMiddleware> ロガー)
        { 
            _next= 次に、
            _logger = ロガー; 
            actionOptions(_option); 
            _exceptionStatusCodeDic = 新たな新しい辞書< 整数文字列 > 
            { 
                { 401" 不正な要求" }、
                { 404" ページが見つかりません" }、
                { 403" アクセス拒否された" }、
                { 500" サーバーエラー事故" }
            }; 
        } 

        パブリック 非同期タスク起動(のHttpContextコンテキスト)
        { 
            例外例外 = NULL ;
             試み
            { 
                のawait -next(コンテキスト); // ミドルウェア呼び出しの次のパイプ
            }
             キャッチ(AppException EX)
            { 
                context.Response.StatusCode = StatusCodes.Status200OK ;
                 VAR apiResponse = 新しい新しい {isSuccess ApiResponse()= falseに、メッセージ= ex.ErrorMsg};
                 VARserializerResult = JsonConvert.SerializeObject(apiResponse)。
                context.Response.ContentType = " アプリケーション/ JSON;のcharset = UTF-8 " await context.Response.WriteAsync(serializerResult)。
            } 
            キャッチ(例外例)
            { 
                context.Response.Clear()。
                context.Response.StatusCode = StatusCodes.Status500InternalServerError。// 发生未捕获的异常、手动设置状态码 
                例外= 元; 
            } 
            最後に
            、{ 
                もし(!_exceptionStatusCodeDic.ContainsKey(context.Response.StatusCode)&& context.Items.ContainsKey(" ExceptionHandled "))// 预处理标记
                {
                     文字列errorMsg内容。
                    もし(context.Response.StatusCode == 500!&&例外= ヌル
                    { 
                        errorMsg内容 = $ " :{}(!?exception.Message exception.InnerException = nullをexception.InnerException.Message)" 
                        _logger.LogError(errorMsg内容)。
                    } 
                    
                    { 
                        ERRORMSG = _exceptionStatusCodeDic [context.Response.StatusCode]; 
                    } 
                    例外 = 新しい新しい例外(errorMsg内容); 
                } 
                IF(例外=!ヌル
                { 
                    VAR HandleTypeを= _option.HandleType;
                     IF(HandleTypeを== AppExceptionHandleType.Both)// のURL決定されたキーワードを例外処理
                    {
                         VAR requestPath = context.Request.Path; 
                        HandleTypeを= _option.JsonHandleUrlKeys!= nullの && _option.JsonHandleUrlKeys.Count(
                                         K => requestPath.StartsWithSegments(K、StringComparison.CurrentCultureIgnoreCase))> 0AppExceptionHandleType.JsonHandle 
                            :AppExceptionHandleType.PageHandle。
                    } 
                    場合(HandleTypeを== AppExceptionHandleType.JsonHandle)を
                         待つJsonHandle(コンテキスト、例外)。
                    
                        のawait PageHandle(コンテキスト、例外、_option.ErrorHandingPath)。
                }  
            }
        }

        ///  <要約> 
        /// 均一な形式のレスポンスクラス
         ///  </要約> 
        ///  ます。<param name = "EX"> </ param>の
        ///  <戻り値> </戻り値> 
        プライベートApiResponse GetApiResponse(例外EX)
        { 
            戻り 新しい新しい isSuccess {=)(ApiResponseをfalseに、メッセージ= ex.Messageを}; 
        } 

        ///  <まとめ> 
        /// 処置:リターンJSON形式
         ///  </要約> 
        ///  <PARAM名= "文脈"> </ param>の
        ///  <PARAM NAME = "EX"> </ param>の
        ///  <戻り値> </戻ります>
        プライベート 非同期タスクJsonHandle(のHttpContextコンテキスト、のSystem.Exception EX)
        { 
            VAR apiResponse = GetApiResponse(EX)。
            VAR serializerResult = JsonConvert.SerializeObject(apiResponse)。
            context.Response.ContentType = " アプリケーション/ JSON;のcharset = UTF-8 " await context.Response.WriteAsync(serializerResult)。
        } 

        ///  <要約> 
        /// 处理方式:跳转网页
         ///  </要約> 
        ///  <PARAM NAME = "コンテキスト"> </ PARAM> 
        ///  <PARAM NAME = "EX"> < / param>の
        ///  <
        ///  <戻り値> </戻り> 
        プライベート 非同期タスクPageHandle(のHttpContextコンテキスト、のSystem.Exception EX、PathStringパス)
        { 
            context.Items.Add(" 例外" 、EX);
             VAR originPath = context.Request.Path、
            コンテキスト.Request.Path =パス;    // エラーにジャンプするように設定ページ要求ページ
            試みを
            { 
                のawait -next(コンテキスト); 
            } 
            キャッチ
            { 

            } 
            最後に
            { 
                context.Request.Path = originPath;    //復元元の要求ページ
            } 
        } 
    }

図2に示すように、例外処理が追加された構成アイテムAppExceptionHandlerOption

 パブリック クラスAppExceptionHandlerOption 
    { 
        公共AppExceptionHandlerOption(
            AppExceptionHandleType HandleTypeを = AppExceptionHandleType.JsonHandle、
            のIList <PathString> jsonHandleUrlKeys = ヌル文字列 errorHandingPath = "" 
        { 
            HandleTypeを = HandleTypeを。
            JsonHandleUrlKeys = jsonHandleUrlKeys。
            ErrorHandingPath = errorHandingPath。
        } 

        ///  <要約> 
        ///例外処理が
         ///  </要約> 
        公共 AppExceptionHandleTypeザHandleTypeを{ GETSET ;} 

        ///  <まとめ> 
        /// のURLキーワードJSON処理モード
         ///  <パラ> 有効にのみ=両方ザHandleTypeを</パラ> 
        ///  </要約> 
        公共のIList <PathString> JsonHandleUrlKeys { GETSET ;} 

        ///  <まとめ> 
        /// エラージャンプページ
         ///  </要約> 
        公共 PathString ErrorHandingPath { GETSET ;} 
    }

3、エラー処理スキーム

  ///  <まとめ> 
    /// エラー処理
     ///  </要約> 
    パブリック 列挙AppExceptionHandleType 
    { 
        JsonHandle = 0// 処理JSON形式 
        PageHandle =を1// ウェブページを処理スキップ 
        どちら= 2           // キーのURL自動ワープロ 
    }

図4に示すように、対応する構造

 パブリック クラスApiResponse 
    { 
        公共の int型国家=> IsSuccess?10 パブリック ブール IsSuccess { 取得しますセット; }
         パブリック 文字列メッセージ{ GETセット; } 
    }

5、拡張子

  パブリック 静的 クラスAppExceptionHandlerExtensions 
    { 
        パブリック 静的 IApplicationBuilder UserAppExceptionHandler(この IApplicationBuilderアプリケーション、アクション<AppExceptionHandlerOption> オプション)
        { 
            リターン app.UseMiddleware <AppExceptionHandlerMiddleware> オプション)。
        } 

    }

 6、カスタム例外タイプ

 パブリック クラスAppException:例外
    { 
        公共の 文字列 ERRORMSG { 取得しますセット; }
         公共 AppException(ストリングerrorMsg内容)
        { 
            ERRORMSG = errorMsg内容。
        } 
    }

 

おすすめ

転載: www.cnblogs.com/caowb/p/11976885.html