Computer >> 컴퓨터 >  >> 프로그램 작성 >> C#

C#ASP.NET WebAPI에서 처리되지 않은 예외를 처리하기 위해 예외 필터를 어떻게 만들 수 있습니까?

<시간/>

컨트롤러 메서드가 HttpResponseException 예외가 아닌 처리되지 않은 예외를 throw하면 예외 필터가 실행됩니다. HttpResponseException 유형은 HTTP 응답을 반환하도록 특별히 설계되었기 때문에 특수한 경우입니다.

예외 필터는 System.Web.Http.Filters.IExceptionFilter 인터페이스를 구현합니다. 예외 필터를 작성하는 가장 간단한 방법은 System.Web.Http.Filters.ExceptionFilterAttribute 클래스에서 파생되고 OnException 메서드를 재정의하는 것입니다.

아래는 NotFiniteNumberException 예외를 HTTP 상태 코드 416, 요청된 범위가 충족되지 않음으로 변환하는 필터입니다. .

예외 필터 속성 -

using System;
using System.Net;
using System.Net.Http;
using System.Web.Http.Filters;
namespace DemoWebApplication.Controllers{
   public class ExceptionAttribute : ExceptionFilterAttribute{
      public override void OnException(HttpActionExecutedContext context){
         if (context.Exception is NotFiniteNumberException){
            context.Response = new HttpResponseMessage(HttpStatusCode.RequestedRangeNotSatisfiable);
         }
      }
   }
}

컨트롤러 작업 방법 -

using DemoWebApplication.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace DemoWebApplication.Controllers{
   [Exception]
   public class StudentController : ApiController{
      List<Student> students = new List<Student>{
         new Student{
            Id = 1,
            Name = "Mark"
         },
         new Student{
            Id = 2,
            Name = "John"
         }
      };
      public Student Get(int id){
         if(id <= 0){
            throw new NotFiniteNumberException("The Id is not valid");
         }
         var studentForId = students.FirstOrDefault(x => x.Id == id);
         return studentForId;
      }
   }
}

따라서 컨트롤러 작업 메서드에 대해 id =0을 전달하여 위의 ExceptionAttribute를 테스트해 보겠습니다.

C#ASP.NET WebAPI에서 처리되지 않은 예외를 처리하기 위해 예외 필터를 어떻게 만들 수 있습니까?

ExceptionAttribute는 다음 방법 중 하나로 등록할 수 있습니다.

  • 예외 필터로 액션을 장식하세요.

[Exception]
   public IHttpActionResult Get(int id){
   Return Ok();
}
  • 예외 필터로 컨트롤러를 장식하세요.

[Exception]
public class StudentController : ApiController{
   public IHttpActionResult Get(int id){
      Return Ok();
   }
}
  • WebApiConfig.cs에서 전역적으로 예외를 등록합니다.

public static class WebApiConfig{
   public static void Register(HttpConfiguration config){
      config.Filters.Add(new ExceptionAttribute());
   }
}