ASP.NET CORE 학습 튜 토리 얼 의 사용자 정의 이상 처리 상세 설명

왜 이상 처리 로 중간 부품 을 선택 합 니까?
전통 적 인 ASP.NET 은 이상 필 터 를 사용 하여 이상 을 처리 할 수 있 습 니 다.ASP.NET CORE 에 서 는 여러 개의 미들웨어 로 연 결 된 파이프 형식 으로 요청 을 처리 할 수 있 습 니 다.그러나 자주 사용 하 는 5 대 필 터 는 보존 되 고 이상 필터 로 이상 을 처리 할 수 있 습 니 다.그러나 이상 필 터 는 MVC 미들웨어 이외 의 이상 을 처리 할 수 없습니다.전체적인 통일 을 위해 고려 합 니 다.미들웨어 처리 이상 이 더욱 적합 하 다.
왜 사용자 정의 이상 미들웨어 를 선택 합 니까?
먼저 ASP.NET CORE 에 내 장 된 세 개의 이상 처리 미들웨어 Developer ExceptionPageMiddleware,ExceptionHandler Middleware,Status CodePageMiddleware 를 살 펴 보 겠 습 니 다.
1.DeveloperExceptionPageMiddleware
민감 한 정보 가 포함 되 어 있 기 때문에 개발 환경 에 만 적합 합 니 다.
2.ExceptionHandlerMiddleware(장 신 블 로그:https://www.jb51.net/article/153926.htm)
500 오류 만 처리
3.StatusCodePagesMiddleware(장 신 블 로그:https://www.jb51.net/article/153931.htm)
400-599 사이 의 오 류 를 처리 할 수 있 지만 Response 에 내용 을 포함 할 수 없습니다(ContentLength=0&&ContentType=null,실험 을 통 해 mvc 에서 이상 을 포착 하지 못 했 습 니 다)
Exception Handler Middleware 와 Status CodePagesMiddleware 의 각각의 제한 조건 때문에 둘 을 조합 해서 사용 해 야 한다.이에 비해 사용자 정의 미들웨어 가 더욱 유연 하고 각종 오류 상 태 를 통일 적 으로 처리 할 수 있 으 며 설정 에 따라 처리 방식 을 결정 할 수 있 습 니 다.
CustomExceptionMiddleWare
우선 이상 미들웨어 설정 클래스 를 설명 합 니 다.

/// <summary>
 ///          
 /// </summary>
 public class CustomExceptionMiddleWareOption
 {
 public CustomExceptionMiddleWareOption(
  CustomExceptionHandleType handleType = CustomExceptionHandleType.JsonHandle,
  IList<PathString> jsonHandleUrlKeys = null,
  string errorHandingPath = "")
 {
  HandleType = handleType;
  JsonHandleUrlKeys = jsonHandleUrlKeys;
  ErrorHandingPath = errorHandingPath;
 }

 /// <summary>
 ///       
 /// </summary>
 public CustomExceptionHandleType HandleType { get; set; }

 /// <summary>
 /// Json     Url   
 /// <para> HandleType=Both   </para>
 /// </summary>
 public IList<PathString> JsonHandleUrlKeys { get; set; }

 /// <summary>
 ///       
 /// </summary>
 public PathString ErrorHandingPath { get; set; }
 }

 /// <summary>
 ///       
 /// </summary>
 public enum CustomExceptionHandleType
 {
 JsonHandle = 0, //Json    
 PageHandle = 1, //      
 Both = 2  //  Url       
 }
이상 미들웨어 를 설명 하 는 구성원

/// <summary>
 ///       
 /// </summary>
 private RequestDelegate _next;

 /// <summary>
 ///     
 /// </summary>
 private CustomExceptionMiddleWareOption _option;

 /// <summary>
 ///           
 /// </summary>
 private IDictionary<int, string> exceptionStatusCodeDic;

 public CustomExceptionMiddleWare(RequestDelegate next, CustomExceptionMiddleWareOption option)
 {
  _next = next;
  _option = option;
  exceptionStatusCodeDic = new Dictionary<int, string>
  {
  { 401, "      " },
  { 404, "      " },
  { 403, "     " },
  { 500, "          " }
  //        
  };
 }
이상 미들웨어 주요 논리

public async Task Invoke(HttpContext context)
 {
  Exception exception = null;
  try
  {
  await _next(context); //            
  }
  catch (Exception ex)
  {
  context.Response.Clear(); 
  context.Response.StatusCode = 500; //        ,       
  exception = ex;
  }
  finally
  {
  if (exceptionStatusCodeDic.ContainsKey(context.Response.StatusCode) && 
   !context.Items.ContainsKey("ExceptionHandled")) //     
  {
   var errorMsg = string.Empty;
   if (context.Response.StatusCode == 500 && exception != null)
   {
   errorMsg = $"{exceptionStatusCodeDic[context.Response.StatusCode]}\r
{(exception.InnerException != null ? exception.InnerException.Message : exception.Message)}"; } else { errorMsg = exceptionStatusCodeDic[context.Response.StatusCode]; } exception = new Exception(errorMsg); } if (exception != null) { var handleType = _option.HandleType; if (handleType == CustomExceptionHandleType.Both) // Url { var requestPath = context.Request.Path; handleType = _option.JsonHandleUrlKeys != null && _option.JsonHandleUrlKeys.Count( k => context.Request.Path.StartsWithSegments(k, StringComparison.CurrentCultureIgnoreCase)) > 0 ? CustomExceptionHandleType.JsonHandle : CustomExceptionHandleType.PageHandle; } if (handleType == CustomExceptionHandleType.JsonHandle) await JsonHandle(context, exception); else await PageHandle(context, exception, _option.ErrorHandingPath); } } } /// <summary> /// /// </summary> /// <param name="ex"></param> /// <returns></returns> private ApiResponse GetApiResponse(Exception ex) { return new ApiResponse() { IsSuccess = false, Message = ex.Message }; } /// <summary> /// : Json /// </summary> /// <param name="context"></param> /// <param name="ex"></param> /// <returns></returns> private async Task JsonHandle(HttpContext context, Exception ex) { var apiResponse = GetApiResponse(ex); var serialzeStr = JsonConvert.SerializeObject(apiResponse); context.Response.ContentType = "application/json"; await context.Response.WriteAsync(serialzeStr, Encoding.UTF8); } /// <summary> /// : /// </summary> /// <param name="context"></param> /// <param name="ex"></param> /// <param name="path"></param> /// <returns></returns> private async Task PageHandle(HttpContext context, Exception ex, PathString path) { context.Items.Add("Exception", ex); var originPath = context.Request.Path; context.Request.Path = path; // try { await _next(context); } catch { } finally { context.Request.Path = originPath; // } }
확장 클래스 를 사용 하여 미들웨어 등록 을 진행 합 니 다.

public static class CustomExceptionMiddleWareExtensions
 {

 public static IApplicationBuilder UseCustomException(this IApplicationBuilder app, CustomExceptionMiddleWareOption option)
 {
  return app.UseMiddleware<CustomExceptionMiddleWare>(option);
 }
 }
Startup.cs 의 Configuref 방법 에 이상 미들웨어 를 등록 합 니 다.

 app.UseCustomException(new CustomExceptionMiddleWareOption(
   handleType: CustomExceptionHandleType.Both, //  url         
   jsonHandleUrlKeys: new PathString[] { "/api" },
   errorHandingPath: "/home/error"));
다음은 테스트 를 진행 하 겠 습 니 다.먼저 페이지 를 뛰 어 넘 을 캡 처 되 지 않 은 이상 을 모 의 하 겠 습 니 다.

방문/home/about 결과

접근/home/test 결과(이 주 소 는 존재 하지 않 습 니 다)

OK 이상 페이지 전환 방식 테스트 가 완료 되 었 습 니 다.그 다음 에 우 리 는 통 일 된 형식(json)의 이상 처 리 를 테스트 합 니 다.마찬가지 로 캡 처 되 지 않 은 이상 을 먼저 모 의 합 니 다.

방문/api/token/gettesterror 결과

/api/token/test 에 접근 한 결과(이 주 소 는 존재 하지 않 습 니 다)

/api/token/getvalue 에 접근 한 결과(이 인 터 페 이 스 는 인증 이 필요 합 니 다)

테스트 가 완료 되 었 습 니 다.페이지 전환 과 통 일 된 형식 반환 에 문제 가 없습니다.사용자 정의 이상 미들웨어 가 예상 한 대로 작 동 되 었 습 니 다.
주의해 야 할 것 은 사용자 정의 미들웨어 가 모든 HTTP 요청 에 응답 하기 때문에 처리 논 리 를 간소화 하여 불필요 한 성능 문제 가 발생 하지 않도록 해 야 한 다 는 것 이다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기