ミドルウェアは、例外収集システムの異常を扱うことができます
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))> 0 ?AppExceptionHandleType.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を{ GET、SET ;} /// <まとめ> /// のURLキーワードJSON処理モード /// <パラ> 有効にのみ=両方ザHandleTypeを</パラ> /// </要約> 公共のIList <PathString> JsonHandleUrlKeys { GET、SET ;} /// <まとめ> /// エラージャンプページ /// </要約> 公共 PathString ErrorHandingPath { GET、SET ;} }
3、エラー処理スキーム
/// <まとめ> /// エラー処理 /// </要約> パブリック 列挙AppExceptionHandleType { JsonHandle = 0、 // 処理JSON形式 PageHandle =を1、 // ウェブページを処理スキップ どちら= 2 // キーのURL自動ワープロ }
図4に示すように、対応する構造
パブリック クラスApiResponse { 公共の int型国家=> IsSuccess?1:0 。 パブリック ブール IsSuccess { 取得します。セット; } パブリック 文字列メッセージ{ GET。セット; } }
5、拡張子
パブリック 静的 クラスAppExceptionHandlerExtensions { パブリック 静的 IApplicationBuilder UserAppExceptionHandler(この IApplicationBuilderアプリケーション、アクション<AppExceptionHandlerOption> オプション) { リターン app.UseMiddleware <AppExceptionHandlerMiddleware> (オプション)。 } }
6、カスタム例外タイプ
パブリック クラスAppException:例外 { 公共の 文字列 ERRORMSG { 取得します。セット; } 公共 AppException(ストリングerrorMsg内容) { ERRORMSG = errorMsg内容。 } }