ASP.NET Web API에서 오류를 처리하는 방법

Microsoft의 ASP.NET Web API는 HTTP에서 실행되는 상태 비 저장 RESTful 서비스를 빌드하는 데 사용할 수있는 경량 프레임 워크입니다. 예외는 런타임에 발생하는 오류이며 예외 처리는 애플리케이션 코드에서 런타임 오류를 처리하는 기술입니다.

모든 ASP.NET Web API 개발자는 Web API에서 예외를 처리하는 방법과 Web API 컨트롤러 메서드에서 적절한 오류 코드 및 오류 메시지를 보내는 방법을 알고 있어야합니다. 아래 섹션에서 이러한 작업을 수행하는 방법을 살펴 보겠습니다. 

ASP.NET Web API에서 HttpResponseException 사용

HttpResponseException 클래스를 사용하여 Web API의 컨트롤러 메서드에서 특정 HTTP 상태 코드 및 메시지를 반환 할 수 있습니다. 여기에 예가 있습니다.

공용 직원 GetEmployee (int id)

{

    직원 emp = employeeRepository.Get (id);

    if (emp == null)

    {

        var response = new HttpResponseMessage (HttpStatusCode.NotFound)

        {

            Content = new StringContent ( "Employee does not exist", System.Text.Encoding.UTF8, "text / plain"),

            StatusCode = HttpStatusCode.NotFound

        }

        throw new HttpResponseException (response);

    }

    return emp;

}

웹 API가 IHttpActionResult를 반환하는 경우 아래와 같이 GetEmployee 메서드를 작성할 수 있습니다.

공용 IHttpActionResult GetEmployee (int id)

{

    직원 emp = employeeRepository.Get (id);

    if (emp == null)

    {

        var response = new HttpResponseMessage (HttpStatusCode.NotFound)

        {

            Content = new StringContent ( "Employee does not exist", System.Text.Encoding.UTF8, "text / plain"),

            StatusCode = HttpStatusCode.NotFound

        }

        throw new HttpResponseException (response);

    }

    return Ok (emp);

}

오류 코드 및 오류 메시지는 응답 개체에 할당되며 Web API 컨트롤러의 작업 메서드에서 예외가 발생하면 HttpResponseException 인스턴스가 반환됩니다.

ASP.NET Web API에서 HttpError 사용

Web API 컨트롤러 메서드에서 CreateErrorResponse 확장 메서드를 사용하여 의미있는 오류 코드 및 오류 메시지를 반환 할 수 있습니다. CreateErrorResponse 메서드는 HttpError 개체를 만든 다음 HttpResponseMessage 개체 내에 래핑합니다.

다음 코드 목록은 Web API 컨트롤러 작업 메서드에서 CreateErrorResponse 확장 메서드를 사용하는 방법을 보여줍니다.

공용 IActionResult GetEmployee (int id)

{

    직원 emp = employeeRepository.Get (id);

    if (emp == null)

    {

       string message = "직원이 존재하지 않습니다";

        새로운 HttpResponseException (

            Request.CreateErrorResponse (HttpStatusCode.NotFound, 메시지));

    }

    return Ok (emp);

}

위에 표시된 GetEmployee () 메서드를 참조하십시오. 이 메서드는 직원 ID를 매개 변수로 받아들이고이 ID를 사용하여 직원 저장소 인스턴스를 사용하여 직원 레코드를 검색하고 검색합니다. 지정된 직원 ID가있는 직원 레코드를 찾을 수없는 경우 HttpResponseException 인스턴스가 발생합니다. Web API 컨트롤러 메서드에서 예외 인스턴스가 throw되기 전에 적절한 오류 메시지 및 오류 코드가 어떻게 생성되는지 확인합니다.

ASP.NET Web API에서 예외 필터 사용

예외 필터는 Web API 컨트롤러 메서드에서 생성되는 처리되지 않은 예외를 처리하는 데 사용할 수있는 필터입니다. 즉, 예외 필터를 사용하여 컨트롤러 메서드에서 발생하는 Web API의 처리되지 않은 예외를 포착 할 수 있습니다. 전역 오류 필터는 처리되지 않은 예외가 발생하고 컨트롤러 메서드에서 처리되지 않는 경우 웹 API에서 예외를 처리하는 좋은 방법입니다.

예외 필터를 만들려면 IExceptionFilter 인터페이스를 구현해야합니다. 추상 클래스 ExceptionFilterAttribute를 확장 한 다음 OnException 메서드를 재정 의하여 예외 필터를 만들 수도 있습니다. ExceptionFilterAttribute 추상 클래스는 차례로 IExceptionFilter 인터페이스를 구현합니다.

다음 코드 조각은 ExceptionFilterAttribute 클래스를 확장 한 다음 OnException 메서드를 재정 의하여 사용자 지정 예외 필터를 만드는 방법을 보여줍니다. 컨트롤러 메서드에서 throw 된 표준 예외가 사용자 지정 예외 필터에 의해 캡처 된 다음 적절한 HttpStatusCode를 사용하여 HttpStatusResponse 개체로 변환되는 방법에 유의하십시오.

공용 클래스 CustomExceptionFilter : ExceptionFilterAttribute

    {

        공용 재정의 void OnException (HttpActionExecutedContext actionExecutedContext)

        {

            HttpStatusCode 상태 = HttpStatusCode.InternalServerError;

            문자열 메시지 = String.Empty;

            var exceptionType = actionExecutedContext.Exception.GetType ();

            if (exceptionType == typeof (UnauthorizedAccessException))

            {

                message = "웹 API에 대한 접근 권한이 없습니다.";

                상태 = HttpStatusCode.Unauthorized;

            }

            그렇지 않으면 (exceptionType == typeof (DivideByZeroException))

            {

                message = "내부 서버 오류.";

                상태 = HttpStatusCode.InternalServerError;

            }

            그밖에

            {

                message = "찾을 수 없습니다.";

                상태 = HttpStatusCode.NotFound;

            }

            actionExecutedContext.Response = new HttpResponseMessage ()

            {

                Content = new StringContent (message, System.Text.Encoding.UTF8, "text / plain"),

                StatusCode = 상태

            };

            base.OnException (actionExecutedContext);

        }

    }

HttpConfiguration 개체의 필터 컬렉션에 사용자 지정 예외 필터를 추가해야합니다.

public static void Register (HttpConfiguration 구성)

        {

            config.MapHttpAttributeRoutes ();

            config.Routes.MapHttpRoute (

                이름 : "DefaultApi",

                routeTemplate : "api / {controller} / {id}",

                기본값 : new {id = RouteParameter.Optional}

            );

            config.Formatters.Remove (config.Formatters.XmlFormatter);

            config.Filters.Add (new CustomExceptionFilter ());

        }

다음 세 가지 방법 중 하나로 예외 필터를 등록 할 수 있습니다.

  • 행동 수준에서
  • 컨트롤러 수준에서
  • 전 세계적으로

다음 코드 스 니펫은 액션 레벨, 즉 컨트롤러 액션 메소드에 필터를 적용하는 방법을 보여줍니다.

공용 클래스 EmployeesController : ApiController

{

    [NotImplementedExceptionFilter]

    공용 직원 GetEmployee (int id)

    {

        새로운 NotImplementedException ();

    }

}

컨트롤러 수준에서 예외 필터를 적용하려면 아래와 같이 클래스 수준에서 필터 속성을 사용해야합니다.

[DatabaseExceptionFilter]

공용 클래스 EmployeesController : ApiController

{

    // 일부 코드

}

모든 Web API 컨트롤러에서 작동하도록 전역 적으로 사용자 지정 예외 필터를 적용 할 수도 있습니다. 이를 수행하는 방법은 다음과 같습니다.

GlobalConfiguration.Configuration.Filters.Add (new DatabaseExceptionFilterAttribute ());

다음 코드 조각은 앞에서 만든 사용자 지정 예외 필터를 컨트롤러 메서드에 적용하는 방법을 보여줍니다.

[CustomExceptionFilter]

 공용 IEnumerable Get ()

 {

    새로운 DivideByZeroException (); 

 }

ASP.NET Web API는 컨트롤러 수준과 작업 수준 모두에서 예외를 처리하기 위해 HttpResponseException의 사용을 지원합니다. Web API의 작업 메서드에서 포착되지 않은 예외가 발생하면 예외가 HTTP 상태 코드 500, 즉 "내부 서버 오류"로 변환됩니다. HttpResponseException을 사용하는 경우 HttpResponseException 클래스의 생성자에서 반환 할 상태 코드를 지정할 수 있습니다. 이러한 방식으로 오류 코드를 사용자 정의하여보다 의미있게 만들 수 있습니다.

ASP.NET 및 ASP.NET Core에서 더 많은 작업을 수행하는 방법 :

  • ASP.NET Core에서 메모리 내 캐싱을 사용하는 방법
  • ASP.NET Web API에서 오류를 처리하는 방법
  • Web API 컨트롤러 메서드에 여러 매개 변수를 전달하는 방법
  • ASP.NET Web API에서 요청 및 응답 메타 데이터를 기록하는 방법
  • ASP.NET에서 HttpModules를 사용하는 방법
  • ASP.NET Core Web API의 고급 버전 관리
  • ASP.NET Core에서 종속성 주입을 사용하는 방법
  • ASP.NET에서 세션으로 작업하는 방법
  • ASP.NET에서 HTTPHandler를 사용하는 방법
  • ASP.NET Core에서 IHostedService를 사용하는 방법
  • ASP.NET Core에서 WCF SOAP 서비스를 사용하는 방법
  • ASP.NET Core 애플리케이션의 성능을 개선하는 방법
  • RestSharp를 사용하여 ASP.NET Core Web API를 사용하는 방법
  • ASP.NET Core에서 로깅 작업 방법
  • ASP.NET Core에서 MediatR을 사용하는 방법
  • ASP.NET Core에서 세션 상태로 작업하는 방법
  • ASP.NET Core에서 Nancy를 사용하는 방법
  • ASP.NET Web API의 매개 변수 바인딩 이해
  • ASP.NET Core MVC에서 파일을 업로드하는 방법
  • ASP.NET Core Web API에서 전역 예외 처리를 구현하는 방법
  • ASP.NET Core에서 상태 확인을 구현하는 방법
  • ASP.NET 캐싱의 모범 사례
  • .NET에서 Apache Kafka 메시징을 사용하는 방법
  • 웹 API에서 CORS를 활성화하는 방법
  • WebClient 대 HttpClient 대 HttpWebRequest를 사용하는 경우
  • .NET에서 Redis Cache로 작업하는 방법
  • .NET에서 Task.WaitAll 대 Task.WhenAll을 사용하는 경우