Asp.Net 코어 웹 API 광고 글로벌 예외 미들웨어

미들웨어는 예외 수집 시스템의 이상을 처리 할 수 ​​있습니다

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; 
        } 
    }

 

추천

출처www.cnblogs.com/caowb/p/11976885.html