>  기사  >  백엔드 개발  >  Asp.Net Web API 예외 처리 경험 요약

Asp.Net Web API 예외 처리 경험 요약

PHPz
PHPz원래의
2017-04-04 15:44:572403검색

이전 튜토리얼에서는 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);
        }
    }
이 예에서는 이 ExceptionLogger가 DemoException 유형의 예외만 기록하도록 ShouldLog를 다시 작성합니다. 동일한 예외가 반복적으로 기록되지 않도록 보장하기 위해 클래스 메서드도 호출됩니다. LogAsync 메소드에서는 Log 컴포넌트를 통해 예외를 발생시킨 요청 URL을 기록하고, 예외 정보도 함께 기록했습니다.

다음으로 이 구성 요소를 등록해야 합니다.

Write


config.Services.Add(typeof(IExceptionLogger),new ErroLogger());
이렇게 하면 DemoException에 대한 예외 기록 구성 요소가 개발되어 등록됩니다. Web API 실행 파이프라인에서 처리되지 않은 DemoException이 발생하면 이 구성 요소가 호출되어 기록됩니다.

다음으로 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 = "服务器已被外星人绑架"}));
            }
        }
}

이 예에서는 예외 유형을 결정하고 다양한 HTTP 상태에 따라 클라이언트에 다양한 응답 콘텐츠와 콘텐츠를 반환합니다. 암호.

그런 다음 이 예외 처리 모듈을 구성에 등록하고 App_Start/WebApiConfig.cs 파일의 Register 메서드에

config.Services.Replace(typeof(IExceptionHandler),new ErrorHandler());

를 작성합니다. 시스템의 기본 ExceptionHandler를 사용하면 사용자 정의 핸들러를 사용하여 예외를 처리할 수 있습니다.

예외 기록 및 처리 프로세스 중에 우리는 모두 해당 예외 컨텍스트 매개변수를 만나 현재 요청의 컨텍스트를 얻고, 요청과 응답을 얻을 수 있습니다(조심하세요. 비어 있음) 및 캡처 이 정보를 사용하여 예외의 catch 블록 정보와 같은 예외를 더 잘 설명, 기록 및 처리할 수 있습니다.

이제 ExceptionLogger 컴포넌트와 ExceptionHandler 컴포넌트의 간단한 개발이 완료되었습니다. 개발 프로세스 중에 ExceptionLogger가 전역 예외 기록을 담당한다는 것을 알 수 있습니다. ExceptionLogger는 웹 API 프레임워크 파이프라인에서 발생하는 처리되지 않은 모든 예외를 캡처하고 기록합니다. ExceptionHandler와 ExceptionFilter의 기능이 겹치는데 언제 ExceptionHandler를 사용하고 언제 ExceptionFilter를 사용합니까? 다음 표에 두 가지의 차이점을 나열할 수 있습니다.

 

ExceptionFilter

ExceptionHandler

作用域

ControllerAction

全局

实例个数

无限制

全局唯一

作用条件

Controller实例化成功之后

Web API成功加载之后

ExceptionFilter

ExceptionHandler
범위 컨트롤러, 액션 전역
인스턴스 수 무제한 전역적으로 고유함
작업 조건 컨트롤러인스턴스화 성공 후 웹 API 성공적인 로딩 후
위 표를 보면 알 수 있습니다 처리 세분성이 컨트롤러 및 작업 수준만큼 상세하다면 ExceptionFilter는 이미 특정 작업을 정확하게 찾은 다음 현재 작업에 대한 사용자 정의 개발을 수행할 수 있습니다. ExceptionHandler의 범위는 ExceptionFilter의 범위보다 훨씬 크며 전역 상황을 처리하는 데 더 많은 이점이 있습니다. 웹 API 예외 처리에 대해 제가 말씀드릴 내용은 이것이 전부입니다. 기사에 부정확한 내용이나 질문이 있으면 지적해 주시기 바랍니다.

위 내용은 Asp.Net Web API 예외 처리 경험 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.