2017-11-28 2 views
1

MVC 또는 웹 API 레이어에서 예외를 잡아 내고 예외를 생성 한 URI를 잡고 구성에서 사용자에게 다시 메시지를 조회하는 한 세트의 인터셉터를 갖고 싶습니다.유니티 예외 차단 - 구성

예를 들어 POST/api/v1/vehicle에 대한 동일한 예외가 "VIN is already"응답하는 동안 고유 제약 조건 위반을 throw하는/api/v1/user에 대한 POST는 "User already exists" 체계 안에 ".

Unity에는이 기능이 있습니까? 그렇지 않다면 공개적으로 사용 가능한 소스의 사례가 있습니까?

답변

1

Unity는 ASP.NET 응용 프로그램에서 오류 응답을 사용자 지정하는 데 적합하지 않습니다. 그것은 Dependency Injection 컨테이너이고 모든 필요한 종속성을 가진 컨트롤러를 인스턴스화하기를 원할 것입니다. 애플리케이션 로직과 섞어 놓는 것은 좋지 않습니다 (오류 응답을 맞춤 설정하는 것이 확실합니다).

ASP.NET MVC 및 ASP.NET 웹 API는 필요한 항목 (예 : 예외 필터)에 적합한 확장 지점을 제공합니다. ASP.NET 웹 API 샘플은 다음과 같습니다.

public class CustomExceptionFilterAttribute : ExceptionFilterAttribute 
{ 
    public override void OnException(HttpActionExecutedContext context) 
    { 
     // Add your exception handling here 

     // Check context.Exception and decide whether you need to handle it 
     if (context.Exception is SqlException) 
     { 
      var controllerType = context.ActionContext.ControllerContext.Controller.GetType(); 

      if (controllerType == typeof(UserController)) 
      { 
       context.Response = new HttpResponseMessage(HttpStatusCode.Conflict) 
       { 
        Content = new StringContent("User already exists") 
       }; 
      } 
      else 
      { 
       // Cover other controller types here 
      } 
     } 
    } 
} 

위와 같이 구현이 간단합니다. OnException() 메서드 안에 컨트롤러 및 액션 컨텍스트가있는 예외 자체에 액세스 할 수 있습니다. 논리에서이 컨트롤러 예외에 대해이 예외를 처리해야하는 경우 context.Response을 적절하게 HttpResponseMessage으로 채우고 HTTP 상태 코드와 본문을 선택하면됩니다.

당신은 당신의 WebApiConfig.Register(HttpConfiguration config) 또는 컨트롤러 수준에

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

와 함께 전 세계적으로 이러한 예외 필터를 적용 할 수 있습니다

[CustomExceptionFilter] 
public class UserController : ApiController 

구현 ASP.NET MVC 매우 유사합니다. 이 경우 필터에 System.Web.Mvc.IExceptionFilter을 구현해야합니다.