ASP.NET Core 응용 오류 처리 Developer ExceptionPageMiddleware 미들웨어 에서'개발 자 이상 페이지'표시

머리말
에서 우 리 는 몇 가지 간단 한 사례 를 통 해 오류 페이지 를 어떻게 보 여 주 는 지 보 여 주 었 다.이런 오류 페이지 의 표현 은 각각 세 개의 대응 하 는 미들웨어 로 이 루어 졌 다.그 다음 에 우 리 는 이 세 개의 미들웨어 에 대해 상세 하 게 소개 할 것 이다.개발 환경 에 나타 난 이상 페이지 는 Developer Exception Page Middleware 미들웨어 미들웨어 미들웨어 형식 을 통 해 이 루어 집 니 다.

 public class DeveloperExceptionPageMiddleware
 {
 public DeveloperExceptionPageMiddleware(RequestDelegate next, IOptions<DeveloperExceptionPageOptions> options, 
  ILoggerFactory loggerFactory, IHostingEnvironment hostingEnvironment, DiagnosticSource diagnosticSource);
 public Task Invoke(HttpContext context);
 }
위의 코드 세 션 에서 보 듯 이 Developer ExceptionPageMiddleware 대상 을 만 들 때 IOptions대상 을 매개 변수 로 제공 해 야 합 니 다.Developer ExceptionPageOptions 대상 은 이 미들웨어 에 지정 한 설정 옵션 을 가지 고 있 습 니 다.구체 적 인 설정 옵션 은 다음 과 같은 다른 속성(FileProvider 와 SourceCodeLine Count)에 나타 납 니 다.

 public class DeveloperExceptionPageOptions
 {
  public IFileProvider  FileProvider { get; set; }
  public int    SourceCodeLineCount { get; set; }
 }
일반적으로 우 리 는 applicationBuilder 의 확장 방법 인 UseDeveloper ExceptionPage 방법 을 호출 하여 이 Developer ExceptionPage Middleware 미들웨어 미들웨어 를 등록 합 니 다.이 두 확장 방법 은 다음 과 같은 방식 으로 이 Developer ExceptionPage Middleware 미들웨어 미들웨어 미들웨어 를 만 들 고 등록 합 니 다.

 public static class DeveloperExceptionPageExtensions
 { 
  public static IApplicationBuilder UseDeveloperExceptionPage(this IApplicationBuilder app)
  {
   return app.UseMiddleware<DeveloperExceptionPageMiddleware>();
  } 
  public static IApplicationBuilder UseDeveloperExceptionPage(this IApplicationBuilder app,DeveloperExceptionPageOptions options)
  {
   return app.UseMiddleware<DeveloperExceptionPageMiddleware>(Options.Create(options));
  }
 }
'ASP.NET Core 응용 오류 처리[1]:오류 페이지 를 보 여 주 는 세 가지 방식'인 스 턴 스 프레젠테이션 에서 우 리 는 Developer ExceptionPageOptions 라 는 대상 을 사용 한 적 이 없다.이 유형 에 정 의 된 이 두 가지 속성 에 대해 많은 사람들 이 도대체 어떤 설정 으로 사용 할 수 있 는 지 모른다 고 생각한다.이 문 제 를 분명하게 풀 려 면 Developer Exception Page Middleware 미들웨어 미들웨어 에서 처리 하 는 두 가지 이상 유형 부터 말 해 야 합 니 다.전체적으로 보면 이 미들웨어 처리 의 이상 은 크게 두 가지 로 나 눌 수 있 는데 그것 이 바로'운행 시 이상'과'컴 파일 이상'이다.후자 유형 은 ICompilation Exception 인 터 페 이 스 를 실현 했다.다음 과 같은 코드 세 션 은 대체적으로 이상 처리 가 Developer ExceptionPageMiddleware 미들웨어 미들웨어 에서 의 실현 을 나 타 냈 다.

 public class DeveloperExceptionPageMiddleware
 {
  private RequestDelegate _next;
  public async Task Invoke(HttpContext context)
  {
   try
   {
    await _next(context);
   }
   catch(Exception ex)
   {
    context.Response.Clear();
    context.Response.StatusCode = 500;
 
    ICompilationException compilationException = ex as ICompilationException;
    if (null != compilationException)
    {
     await DisplayCompilationException(context, compilationException);
    }
    else
    {
     await DisplayRuntimeException(context, ex);
    }
   }
  }
 
  private Task DisplayRuntimeException(HttpContext context, Exception ex);
  private Task DisplayCompilationException(HttpContext context,ICompilationException compilationException) ;
 }
1.컴 파일 이상 처리
많은 사람들 이 궁금 해 할 것 같 습 니 다.우 리 는 ASP.NET Core 응용 프로그램 을 만 들 려 면 먼저 프로그램 집합 으로 컴 파일 한 다음 에 배치 하고 실행 을 시작 해 야 합 니 다.왜 실행 과정 에서'컴 파일 이상'이 발생 합 니까?ASP.NET Core 응용 차원 에서 볼 때 우 리 는'사전 컴 파일'을 사용 합 니 다.즉,우리 가 배치 한 것 은 소스 코드 가 아니 라 컴 파일 된 프로그램 집합 이기 때문에 운영 과정 에서'컴 파일 이상'설 이 존재 하지 않 습 니 다.그러나 ASP.NET Core MVC 응용 프로그램 에서 보기 파일(.cshtml)은'동적 컴 파일'을 지원 하 는 것 을 잊 지 마 세 요.즉,우 리 는 보기 원본 파일 을 직접 배치 할 수 있 고 실행 과정 에서 동적 으로 컴 파일 할 수 있다.다시 말 하면 보기 파일 은 동적 컴 파일 을 지원 하기 때문에 배치 환경 에서 보기 파일 을 직접 수정 할 수 있 습 니 다.
Developer ExceptionPageMiddleware 미들웨어 미들웨어 의 경우 일반적인 실행 시 이상 한 경우 HTML 문서 형식 으로 이상 한 자신의 상세 한 정보 와 현재 요청 한 정 보 를 HTML 문서 형식 으로 보 여 줍 니 다.앞에서 보 여 준 인 스 턴 스 는 이 점 을 잘 설명 합 니 다.동적 컴 파일 보기 파일 에 컴 파일 이상 이 발생 하면 최종 적 으로 보 여 주 는 오류 페이지 는 서로 다른 구조 와 내용 을 가지 게 됩 니 다.저 희 는 간단 한 인 스 턴 스 를 통 해 Developer ExceptionPageMiddleware 미들웨어 미들웨어 미들웨어 가 컴 파일 이상 에 대한 처 리 를 보 여 줍 니 다.
우 리 는 다음 과 같은 코드 를 통 해 ASP.NET Core MVC 응용 프로그램 을 시작 하고 응용 프로그램 빌 더 의 확장 방법 인 UseDeveloper Exception Page 를 호출 하여 Developer Exception Page Middleware 미들웨어 미들웨어 를 등록 하 였 습 니 다.HomeController 에 정 의 된 Action 방법 Index 에 대응 하 는 보 기 를 보 여 줍 니 다.

 public class Program
 {
  public static void Main()
  {
   new WebHostBuilder()
    .UseKestrel()
    .UseContentRoot(Directory.GetCurrentDirectory())
    .ConfigureServices(svcs => svcs.AddMvc())
    .Configure(app => app
     .UseDeveloperExceptionPage()
     .UseMvc())
    .Build()
    .Run();
  }
 }
 
 public class HomeController : Controller
 {
  [HttpGet("/")]
  public IActionResult Index()
  {
   return View();
  }
}
약속 에 따라 Action 방법 Index 가 보 여 주 는 보기 파일 에 대응 하 는 경 로 는'~/views/home/index.cshtml'이 어야 합 니 다.이 경 로 를 위해 이 보기 파일 을 만 듭 니 다.동적 컴 파일 과정 에서 컴 파일 이상 이 발생 할 수 있 도록 이 보기 파일 에서 다음 세 줄 의 코드 를 작 성 했 습 니 다.Foobar 는 만 들 지 않 은 형식 입 니 다.

 @{ 
  var value = new Foobar();
 }
브 라 우 저 를 이용 하여 HomeController 의 Action 방법 Index 를 방문 할 때 대상 보 기 를 동적 으로 컴 파일 합 니 다.보기 파일 에 정의 되 지 않 은 형식 을 사 용 했 기 때문에 동적 컴 파일 이 실패 하고 응답 하 는 오류 정 보 는 그림 7 과 같은 형식 으로 브 라 우 저 에 나타 납 니 다.오류 페이지 에 표 시 된 내용 과 구 조 는 앞에서 보 여 준 인 스 턴 스 와 완전히 다르다 는 것 을 알 수 있 습 니 다.이 오류 페이지 에서 컴 파일 에 실패 한 보기 파일 의 경로("Views/Home/Index.cshtml")를 얻 을 수 있 을 뿐만 아니 라 컴 파일 에 실패 한 코드 도 직접 볼 수 있 습 니 다.뿐만 아니 라 이 오류 페이지 는 컴 파일 에 참여 하 는 소스 코드(.cshtml 파일 에 정 의 된 원본 코드 가 아니 라 변환 처 리 를 통 해 생 성 된 C\#코드)를 직접 사용 합 니 다.의심 할 여지없이 이 상세 한 오류 페이지 는 개발 자의 오류 정정 을 믿 는 데 매우 가치 가 있다.
ASP.NET Core 응용 오류 처리[1]:오류 페이지 를 보 여 주 는 세 가지 방식
일반적으로 동적 컴 파일 의 전체 과정 은 두 가지 절차 로 구성 되 는데 먼저 소스 코드(.cshtml 와 같은 템 플 릿 파일)를 특정한.NET 언어(예 를 들 어 C\#)를 대상 으로 하 는 코드 로 변환 한 다음 에 IL 코드 로 컴 파일 한다.동적 컴 파일 과정 에서 던 진 이상 유형 은 일반적으로 ICompilation Exception 인 터 페 이 스 를 실현 합 니 다.아래 코드 세 션 에서 보 듯 이 이 인터페이스 값 은 유일한 속성 을 가지 고 있 습 니 다.Compilation Failures 는 하나의 요소 유형 을 Compilation Failure 의 집합 으로 되 돌려 줍 니 다.컴 파일 에 실패 한 관련 정 보 는 Compilation Failure 대상 에 봉인 되 어 있 습 니 다.원본 파일 의 경로(SourceFilePath)와 내용(SourceFileContent),그리고 소스 코드 를 변환 하여 컴 파일 된 내용 을 전달 할 수 있 습 니 다.내용 변환 과정 에서 오류 가 발생 하면 SourceFileContent 속성 은 Null 로 되 돌아 갈 수 있 습 니 다.

 public interface ICompilationException
 {
  IEnumerable<CompilationFailure> CompilationFailures { get; }
 }
 
 public class CompilationFailure
 {
  public string        SourceFileContent { get; }
  public string        SourceFilePath { get; }
  public string        CompiledContent { get; }
  public IEnumerable<DiagnosticMessage>  Messages { get; }
  …
 }
Compilation Failure 형식 은 Messages 라 는 읽 기 전용 속성 도 가지 고 있 습 니 다.DiagnosticMessage 라 는 요소 유형 을 되 돌려 줍 니 다.DiagnosticMessage 대상 은 컴 파일 오 류 를 설명 하 는 진단 정 보 를 담 고 있 습 니 다.저 희 는 DiagnosticMessage 대상 의 관련 속성 을 통 해 컴 파일 오류 메시지(Message 와 FormattedMessage)를 설명 할 수 있 을 뿐만 아니 라 컴 파일 오류 가 발생 한 원본 파일 의 경로(Source FilePath)와 범위,StartLine,StartColumn,EndLine 과 EndColumn 속성 은 컴 파일 오 류 를 일 으 킨 소스 코드 가 원본 파일 에서 시작 되 고 끝 난 줄 과 열(줄 수 와 열 수 는 각각 1 과 0 부터 계산)을 나타 낸다.

 public class DiagnosticMessage
 {
  public string  SourceFilePath { get; }
  public int  StartLine { get; }
  public int  StartColumn { get; } 
  public int  EndLine { get; }
  public int  EndColumn { get; }
 
  public string  Message { get; }  
  public string  FormattedMessage { get; } 
 …
 }
위의 그림 에서 보 듯 이 오류 페이지 는 컴 파일 에 실패 한 관련 소스 코드 를 직접 표시 합 니 다.구체 적 으로 말 하면 실 패 를 직접적 으로 초래 하 는 소스 코드 를 실현 할 뿐만 아니 라 앞 뒤 가 인접 한 소스 코드 도 동시에 표시 할 수 있다.인접 소스 코드 에 대해 몇 줄 을 표시 해 야 하 는 지 는 실제 적 으로 Developer ExceptionPageOptions 의 SourceCodeLine Count 속성 을 통 해 제 어 됩 니 다.

 public class Program
 {
  public static void Main()
  {
   new WebHostBuilder()
    .UseKestrel()
    .UseContentRoot(Directory.GetCurrentDirectory())
    .ConfigureServices(svcs => svcs.AddMvc())
    .Configure(app => app
     .UseDeveloperExceptionPage(new DeveloperExceptionPageOptions { SourceCodeLineCount = 3 })
     .UseMvc())
    .Build()
    .Run();
  }
 }
앞에서 보 여 준 이 인 스 턴 스 의 경우 앞 뒤 가 인접 한 세 줄 코드 가 오류 페이지 에 표시 되 기 를 원한 다 면 등 록 된 Developer ExceptionPage Middleware 미들웨어 미들웨어 미들웨어 에 Developer ExceptionPage Options 대상 을 지정 하고 Source CodeLine Count 속성 을 3 으로 설정 할 수 있 습 니 다.이 동시에 저 희 는 보기 파일(index.cshtml)을 다음 과 같은 형식 으로 바 꾸 었 습 니 다.즉,컴 파일 에 실패 한 줄 코드 전후 에 각각 4 줄 코드 를 추가 하 였 습 니 다.

 1:
 2:
 3:
 4:
 5:@{ var value = new Foobar();}
 6:
 7:
 8:
 9:
보기 파일 에 정 의 된 총 9 줄 코드 는 Developer ExceptionPageMiddleware 미들웨어 미들웨어 를 등록 할 때 지정 한 규칙 에 따라 오류 페이지 에 표 시 된 것 은 두 번 째 줄 에서 여덟 번 째 줄 로 표 시 됩 니 다.브 라 우 저 를 이용 하여 같은 주 소 를 방문 하면 7 줄 코드 가 다음 그림 의 형식 으로 오류 페이지 에 나타 나 는 것 을 볼 수 있 습 니 다.특히 우리 가 SourceCodeLine Count 속성 을 명시 적 으로 설정 하지 않 았 다 면 기본 값 은 6 입 니 다.

2.운행 시 이상 처리
Developer Exception PageMiddleware 미들웨어 미들웨어 의 경우 ICompilation Exception 인터페이스 가 구현 되 지 않 은 모든 유형 이'실행 시 이상'으로 간 주 됩 니 다.에서 보 여 준 인 스 턴 스 를 통 해 알 수 있 듯 이 Developer ExceptionPageMiddleware 미들웨어 미들웨어 는 실행 중 이상 을 처리 할 때 이상 한 상세 정 보 를 오류 페이지 에 표시 할 뿐만 아니 라 현재 요청 과 관련 된 정보 도 포함 합 니 다.검색 문자열,Cookie,요청 헤더 집합 을 포함 합 니 다.지금 우리 가 관심 을 가 지 는 것 은 또 다른 문제 입 니 다.우 리 는 Developer ExceptionPage Options 를 이용 하여 제공 하 는 이 FileProvider 대상 은 바로 어떤 목적 에서 나 온 것 입 니까?
오류 페이지 에 나타 난 설명 이상 에 대한 자세 한 정 보 는 유형 과 메시지 등 기본 적 인 정 보 를 제외 하고 이상 한 스 택 추적(Stack Trace)도 이 페이지 에 나타 납 니 다.뿐만 아니 라 스 택 이 소스 코드 를 포함 하 는 정보(예 를 들 어 소스 파일 경로 와 해당 하 는 소스 코드 가 있 는 줄 과 열)를 추적 하면 Developer ExceptionPage Middleware 미들웨어 미들웨어 는 소스 파일 을 불 러 오고 이상 한 소스 코드 를 그대로 표시 합 니 다.

 public class Program
 {
  public static void Main()
  {
   new WebHostBuilder()
    .UseKestrel()
    .Configure(app => app
     .UseDeveloperExceptionPage()
     .Run(Invoke))
    .Build()
    .Run();
  }
  private static Task Invoke(HttpContext context)
  {
   throw new InvalidOperationException("Manually thrown exception");
  }
 }
앞에서 보 여 준 코드 를 위 와 같은 형식 으로 바 꾸 고 로 컬 에서 Debug 모드 로 프로그램 을 실행 하면 다음 그림 과 같은 오류 페이지 를 얻 을 수 있 습 니 다.이상 한 스 택 추적 정보 에 소스 코드 가 포 함 된 관련 정보(원본 파일 경로 와 줄 번호)를 볼 수 있 기 때문에 이상 한 줄 코드 는 그대로 표시 할 수 있 습 니 다.컴 파일 이상 처리 방식 과 마찬가지 로 그 와 인접 한 코드 도 포함 되 어 있 습 니 다.구체 적 으로 몇 줄 의 인접 코드 가 표 시 될 지 는 Developer ExceptionPage Options 의 Source CodeLine Count 속성 을 통 해 제어 할 수 있 습 니 다.
ASP.NET Core 응용 오류 처리[1]:오류 페이지 를 보 여 주 는 세 가지 방식
Developer ExceptionPageOptions 의 FileProvider 가 FileProvider 대상 을 제공 하 는 목적 은 원본 파일 의 내용 을 읽 거나 오류 정정 디 버 깅 에 원본 파일 을 제공 하 는 것 입 니 다.개발 자 ExceptionPageMiddleware 미들웨어 미들웨어 를 만 들 때 이러한 FileProvider 를 명시 적 으로 제공 하지 않 으 면 기본적으로 ContentRoot 디 렉 터 리 를 가리 키 는 이 PhysicalFileProvider 를 사용 합 니 다.특히 이상 한 추적 스 택 에 원본 파일 의 경로 가 나타 나 면 Developer ExceptionPageMiddleware 미들웨어 미들웨어 미들웨어 는 항상 로 컬 파일 시스템 에서 이 파일 을 불 러 오 려 고 합 니 다.로 컬 파일 로 딩 에 실패 한 경우 에 만 지정 한 FileProvider 를 이용 하여 파일 을 읽 습 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기