미들웨어는 예외 수집 시스템의 이상을 처리 할 수 있습니다
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 = 새로운 새로운 사전 < INT , 문자열 > { { 401 , " 무단 요청 " }, { 404 , " 페이지를 찾을 수 없습니다 " }, { 403 , " 액세스 거부 " }, { 500 , " 서버 오류 사고 " } }; } 공공 비동기 작업 인보합니다 (HttpContext를 컨텍스트) { 예외 예외 = 널 ; 은 try { AWAIT - 다음 (컨텍스트); // 미들웨어 통화에 대한 다음 파이프 } 캐치 (AppException EX) { context.Response.StatusCode = StatusCodes.Status200OK ; var에 apiResponse = 새로운 새 ApiResponse () = {isSuccess false로 , 메시지 = ex.ErrorMsg} VARserializerResult = JsonConvert.SerializeObject (apiResponse); context.Response.ContentType = " 애플리케이션 / JSON; 문자셋 = 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 && 예외! = null이 ) { 에서 errormsg = $ " {(exception.InnerException = null이 exception.InnerException.Message!? exception.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) AWAIT JsonHandle (컨텍스트 제외); 다른 AWAIT PageHandle (문맥, 예외 _option.ErrorHandingPath); } } } /// <요약> /// 일정한 형식의 응답 클래스 /// </ 요약> /// <PARAM NAME = "EX"> </ PARAM> /// <반품> </ 반품> 개인 ApiResponse GetApiResponse (예외 EX)는 { 돌아가 새로운 새 ApiResponse () = {isSuccess false로 , 메시지 = ; ex.Message} } /// <요약> /// 복귀 JSON 형식 : 치료 /// </ 요약> /// = <PARAM 이름 "컨텍스트"> </ PARAM> /// <PARAM NAME = "EX"> </ PARAM> /// <반품> </ 반품> 개인 비동기작업 JsonHandle (HttpContext를 문맥, System.Exception 예) { var에 apiResponse = GetApiResponse (예); VAR serializerResult = JsonConvert.SerializeObject (apiResponse); context.Response.ContentType = " 애플리케이션 / JSON; 문자셋 = UTF-8 " ; AWAIT context.Response.WriteAsync (serializerResult); } /// <요약> /// 处理方式:跳转网页 /// </ 요약> /// <PARAM NAME = "컨텍스트"> </ PARAM> /// <PARAM NAME = "예"> < / PARAM> /// < /// <반품> </ 반품> 개인 비동기 작업 PageHandle합니다 (HttpContext를 문맥, System.Exception EX, PathString 경로) { context.Items.Add ( " 예외 " , EX); var에 originPath = context.Request.Path, 컨텍스트 .Request.Path = 경로; // 설정 페이지 요청 페이지가 오류로 이동 은 try를 { AWAIT - 다음 (컨텍스트); } 캐치 { } 최종적으로 { 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; } }