이전 튜토리얼에서는 Web API의 필터 개발 및 사용 방법을 소개했습니다. ExceptionFilter에 대해 이야기할 때 함정이 있었습니다. ExceptionFilter는 Action 실행 중에 발생하는 이벤트만 가로채서 처리할 수 있다는 것입니다. . 예외, 작업 실행 프로세스 외부에서 예외가 발생하면 ExceptionFilter는 무력합니다.
이러한 예외에는 다음이 포함됩니다.
1. Controller 생성 메서드에서 발생하는 예외
2. MessageHandler에서 발생하는 예외
3. 발생하는 예외 라우팅 프로세스 중 예외
4. Body의 직렬화/역직렬화 프로세스 중에 발생하는 예외
ExceptionFilter는 ApiControler가 성공적으로 인스턴스화되고 이후에 발생하는 예외만 해결할 수 있음을 알 수 있습니다. Action.Exceptions 실행 중에 이 문제를 해결하기 위해 ExceptionFilter 외에도 예외 기록 및 처리를 위한 두 가지 확장 지점인
IExceptionLogger 및 IExceptionHandler가 도입되었습니다.
그리고 이 두 확장은 웹 API의 파이프라인 구성 요소로 등록 및 관리되며 서로 다른 업무 분담을 가지고 있습니다.IExceptionLogger는 로그를 담당하는 비정상적인 로그 기록 구성 요소입니다. 이상 발생 후 기록은 전체 웹 API 수명 주기를 통해 실행됩니다. 웹 API 프레임워크에서는 요청 주기에서 포착되지 않거나 처리된 예외가 먼저 예외 로그 기록을 위해 예외 로깅 파이프라인에 입력됩니다. 여러 IExceptionLogger 인스턴스가 등록될 수 있습니다. 다양한 예외 처리를 담당합니다. 예외 처리 구성 요소로서 IExceptionHandler는 예외 발생 후 처리를 담당합니다. IExceptionLogger 구성 요소가 기록을 완료하고 예외 처리를 위한 관련 ExceptoinFilter가 없는 경우입니다. 마지막으로 예외 처리를 위해 ExceptionHandler를 호출합니다. Web API에는 예외 처리를 위한 ExceptionHandler가 하나만 있습니다. 웹 API 프레임워크에는 ExceptionLogger와 ExceptionHandler라는 두 가지 기본 클래스가 있습니다. ExceptionLogger 기본 클래스를 사용할 때 이 메서드는 기본 클래스에서 호출되며 해당 기능은 다음을 방지하는 것입니다. 동일한 예외가 동일한 ExceptionLogger 인스턴스에 의해 반복적으로 기록됩니다(예를 들어 후속 파이프라인에서 예외가 다시 발생하거나 동일한 ExceptionLogger 개체가 실수로 두 번 등록되는 경우 ShouldLog를 재정의할 수도 있습니다). 다양한 시나리오에 대해 다양한 ExceptionLogger 호출을 수행하려면 자체 예외 기록 판단 논리를 추가하세요. 관심이 있다면 ExceptionLogger 기본 클래스를 디컴파일하여 살펴보세요. 이는 매우 흥미로운 기술인 디스플레이 인터페이스 구현을 사용합니다. ExceptionLogger 사용 예를 살펴보겠습니다.
public class ErroLogger : ExceptionLogger { public async Task LogAsync(ExceptionLoggerContext context, CancellationToken cancellationToken) { var sb = new StringBuilder(); //获取Log组件 ILogger log = LogManager.GetCurrentClassLogger(); var request = context.Request; sb.AppendLine("URL:"); //获取URL var url = request.RequestUri.ToString(); sb.AppendLine(url); log.Error(context.Exception,sb.ToString(),""); } public override bool ShouldLog(ExceptionLoggerContext context) { return context.Exception is DemoException && base.ShouldLog(context); } }
config.Services.Add(typeof(IExceptionLogger),new ErroLogger());
다음으로 ExceptionHandler를 작성하겠습니다. 전체 웹 API 프레임워크에서 ExceptionHandler는 ExceptionLogger와 마찬가지로 ExceptionHandler 기본 클래스를 상속하여 예외 처리를 단순화할 수 있습니다. 파이프라인의 다른 링크에서 반복적으로 발생하는 예외를 반복적으로 처리하지 않도록 예외를 처리해야 하는지 여부를 결정합니다. 또한 예를 제공합니다.
public class ErrorHandler : ExceptionHandler { public override async Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken) { if (context.Exception is DemoException) { context.Result = new ResponseMessageResult(context.Request.CreateResponse(HttpStatusCode.BadRequest,new {Message=context.Exception.Message})); } else { context.Result = new ResponseMessageResult(context.Request.CreateResponse(HttpStatusCode.InternalServerError,new {Message = "服务器已被外星人绑架"})); } } }
그런 다음 이 예외 처리 모듈을 구성에 등록하고 App_Start/WebApiConfig.cs 파일의 Register 메서드에
config.Services.Replace(typeof(IExceptionHandler),new ErrorHandler());
예외 기록 및 처리 프로세스 중에 우리는 모두 해당 예외 컨텍스트 매개변수를 만나 현재 요청의 컨텍스트를 얻고, 요청과 응답을 얻을 수 있습니다(조심하세요. 비어 있음) 및 캡처 이 정보를 사용하여 예외의 catch 블록 정보와 같은 예외를 더 잘 설명, 기록 및 처리할 수 있습니다.
이제 ExceptionLogger 컴포넌트와 ExceptionHandler 컴포넌트의 간단한 개발이 완료되었습니다. 개발 프로세스 중에 ExceptionLogger가 전역 예외 기록을 담당한다는 것을 알 수 있습니다. ExceptionLogger는 웹 API 프레임워크 파이프라인에서 발생하는 처리되지 않은 모든 예외를 캡처하고 기록합니다. ExceptionHandler와 ExceptionFilter의 기능이 겹치는데 언제 ExceptionHandler를 사용하고 언제 ExceptionFilter를 사용합니까? 다음 표에 두 가지의 차이점을 나열할 수 있습니다.
|
ExceptionFilter | ExceptionHandler | ||||||||||||
범위 | 컨트롤러, 액션 | 전역 | ||||||||||||
인스턴스 수 | 무제한 | 전역적으로 고유함 | ||||||||||||
작업 조건 | 컨트롤러인스턴스화 성공 후 | 웹 API 성공적인 로딩 후 |
위 내용은 Asp.Net Web API 예외 처리 경험 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!