ASP.NET Core 에서 전역 이상 차단 을 실현 하 는 전체 절차

머리말
이상 은 실행 중 오류 입 니 다.이상 이 적당 한 처 리 를 받 지 못 하면 프로그램 이 예상 치 못 하 게 종 료 될 수 있 습 니 다.이 편 은 ASP.Net Core MVC 에서 전체적인 이상 처 리 를 어떻게 실현 하 는 지 에 대해 토론 하 겠 습 니 다.저 는 사례 코드 와 캡 처 를 통 해 이러한 개념 을 설명 하 겠 습 니 다.
전역 이상 처리
사실은 ASP.Net Core MVC 프레임 워 크 에 전역 이상 처리 메커니즘 이 있 습 니 다.중심 화 된 곳 에서 전역 이상 처리 중간 부품 을 사용 하여 이상 차단 을 할 수 있 습 니 다.이런 중심 화 방식 을 사용 하지 않 으 면 Controller 나 Action 역할 영역 에서 만 단독 처리 할 수 있 습 니 다.이 로 인해 이상 처리 코드 가 프로젝트 곳곳에 흩 어 질 수 있 습 니 다.잘 지 키 지 못 하 는 것 도 귀 찮 지 않 습 니까?
두 번 째 로 전역 이상 을 처리 하 는 방법 은 exception filter 를 사용 하 는 것 입 니 다.이 편 에서 저 는 여러분 과 전역 이상 처리 미들웨어 와 UseException Handler 방법 으로 이상 을 관리 하 는 것 에 대해 이야기 하려 고 합 니 다.
UseExceptionHandler 확장 방법 사용 하기
UseExceptionHandler 확장 방법 은 ExceptionHandler 미들웨어 를 Asp.net Core 의 요청 처리 파이프 에 등록 한 다음 IException Handler Feature 인터페이스의 인 스 턴 스 에서 이상 대상 을 가 져 올 수 있 습 니 다.아래 코드 세 션 은 UseExceptionHandler 방법 을 사용 하여 전체 이상 을 차단 하 는 방법 을 보 여 줍 니 다.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
 {
  app.UseExceptionHandler(builder =>
  {
   builder.Run(async context =>
  {
   context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
   context.Response.ContentType = "application/json";

   var exception = context.Features.Get<IExceptionHandlerFeature>();
   if (exception != null)
   {
   var error = new ErrorMessage()
   {
    Stacktrace = exception.Error.StackTrace,
    Message = exception.Error.Message
   };
   var errObj = JsonConvert.SerializeObject(error);

   await context.Response.WriteAsync(errObj).ConfigureAwait(false);
   }
  });
  }
  );


  app.UseStaticFiles();
  app.UseRouting();
  app.UseAuthorization();

  app.UseEndpoints(endpoints =>
  {
  endpoints.MapControllerRoute(
   name: "default",
   pattern: "{controller=Home}/{action=Index}/{id?}");
  });
 }

다음은 코드 에서 인용 한 ErrorMessage 클래스 의 정의 입 니 다.

public class ErrorMessage
 {
 public string Message { get; set; }
 public string Stacktrace { get; set; }
 }
전역 이상 미들웨어 설정
아시 다시 피 ASP.Net Core MVC 프로젝트 에는 Startup.cs 파일 이 있 습 니 다.Configure 방법 에서 전역 이상 차단 미들웨어 코드 를 설정 할 수 있 습 니 다.다음 과 같 습 니 다.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
 {
  if (env.IsDevelopment())
  {
  app.UseDeveloperExceptionPage();
  }
  else
  {
  app.UseExceptionHandler("/Error");
  }
  app.UseStaticFiles();
  app.UseCookiePolicy();
  app.UseMvc(routes =>
  {
  routes.MapRoute(
   name: "default",
   template:
   "{controller=Home}/{action=Index}/{id?}");
  });
 }
위의 app.UseExceptionHandler("/Error")를 중점적으로 볼 수 있 습 니 다.이곳 의 UseExceptionHandler 는 pipeline 등록 을 실 현 했 습 니 다.프로그램 에 처리 되 지 않 은 이상 이 발생 하면 자동 으로 사용 자 를 안내/Error 페이지 로 안내 합 니 다.
UseStatus CodePages With ReExecute 확장 방법 으로 pipeline 에 상태 코드 페이지 를 추가 할 수 있 습 니 다.이것 은 무슨 뜻 입 니까?사실은 http 500 가이드 500 페이지,http 404 가이드 404 페이지 입 니 다.아래 코드 세 션 은 수 정 된 Configure 방법 코드 를 보 여 줍 니 다.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
 {
  if (env.IsDevelopment())
  {
  app.UseDeveloperExceptionPage();
  }
  else
  {
  app.UseExceptionHandler("/Error");
  app.UseStatusCodePagesWithReExecute("/Error/NotFound/{0}");
  }
  
  //Other code
 }
ErrorController 사용 하기
HomeController 아래 에 오 류 를 전문 적 으로 처리 하 는 action 방법 이 있 습 니 다.여기 서 우 리 는 이 action 을 사용 하지 않 습 니 다.당신 은 그것 을 삭제 할 수 있 습 니 다.그 다음 에 저 는 전문 적 인 ErrorController 를 정의 하려 고 합 니 다.그 안에 경로 가/Error 인 action 방법 이 포함 되 어 있 습 니 다.

public class ErrorController : Controller
 {
 [HttpGet("/Error")]
 public IActionResult Index()
 {
  IExceptionHandlerPathFeature iExceptionHandlerFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();

  if (iExceptionHandlerFeature != null)
  {
  string path = iExceptionHandlerFeature.Path;
  Exception exception = iExceptionHandlerFeature.Error;

  //Write code here to log the exception details
  return View("Error",iExceptionHandlerFeature);
  }  
  return View();
 }

 [HttpGet("/Error/NotFound/{statusCode}")]
 public IActionResult NotFound(int statusCode)
 {
  var iStatusCodeReExecuteFeature =HttpContext.Features.Get<IStatusCodeReExecuteFeature>();
  return View("NotFound",iStatusCodeReExecuteFeature.OriginalPath);
 }
 }

IException HandlerPathFeature 로 이상 관련 정 보 를 얻 을 수 있 고,ISTatus Code ReExecuteFeature 로 http 404 이상 시 요청 경 로 를 얻 을 수 있 습 니 다.참,IException HandlerPathFeature 와 ISTatus Code ReExecuteFeature 를 사용 하려 면 nuget 에 Microsoft.AspNetCore.Diagnostics 패 키 지 를 설치 한 것 을 기억 하 세 요.다음 코드 는 이상 발생 시간의 경로 주 소 를 가 져 오 는 방법 을 보 여 줍 니 다.

string route = iExceptionHandlerFeature.Path;
이상 한 자세 한 정 보 를 얻 으 려 면 다음 문 구 를 사용 할 수 있 습 니 다.

var exception = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
이 경로 의 주소 와 이상 한 상세 한 정 보 를 얻 으 면 로그 파일 에 기록 할 수 있 으 며 추가 적 으로 자세히 분석 할 수 있 습 니 다.
보기 로 오류 정보 보 여주 기
오류 정 보 를 보 여 주 는 View 를 만 들 수 있 습 니 다.다음 에 Error View Page 의 자세 한 코드 를 보 여 줍 니 다.

@model Microsoft.AspNetCore.Diagnostics.IExceptionHandlerFeature
@{
 ViewData["Title"] = "Index";
 Layout = "~/Views/Shared/_Layout.cshtml";
}
<div class="row">
 <div class="text-danger">
  <h3>Error: @Model.Error.Message</h3>
 </div>
</div>
<div class="row">
 <div class="col-12">
  <p>@Model.Error.StackTrace</p>
  <p>@Model.Error.InnerException</p>
 </div>
</div>
다음은 NotFound 페이지 의 코드 입 니 다.

@model string
@{
 ViewData["Title"] = "NotFound";
 Layout = "~/Views/Shared/_Layout.cshtml";
}
 <h1 class="text-danger">
 Error: The requested URL @Model was not found!</h1>
<hr />
이제 프로그램 을 달 릴 수 있 습 니 다.다음 과 같은 잘못된 정 보 를 볼 수 있 습 니 다.

존재 하지 않 는 페이지 를 열 려 고 시도 하면 ErrorController.NotFound 가 포장 한 404 설명 정보 로 자동 으로 이동 합 니 다.

ASP.NET Core 에 전역 이상 처리 가 내장 되 어 있 습 니 다.이 기술 을 이용 하여 집중 화 된 곳 에서 응용 프로그램의 모든 이상 정 보 를 캡 처 할 수 있 습 니 다.물론 환경 에 따라 사용 하지 않 는 이상 처리 조 치 를 취 할 수 있 습 니 다.예 를 들 어 개발 환경,테스트 환경,생산 환경 등 입 니 다.
링크
더 많은 고 품질 건어물:나의 GitHub 참조:https://www.infoworld.com/art
ASP.NET Core 에서 전역 이상 차단 을 실현 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 ASP.NET Core 전역 이상 차단 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기