ASP.NET 웹 API 통합 예외 처리에 사용 속성

모든 예외는 더 어려워 코드 수정의 양의 증가와 함께, 후속의 시스템 번 예외 처리 메커니즘을 수정하는 반복적 인 코드를 많이 발생할 수 있습니다 시도 - 캐치 과정을 반복해야합니다.

글로벌 예외 필터 기능에서 특히 증가, 이와 같은이 개발자가 사용할 수 많은 필터는 Aspect 지향적 인 프로그래밍을 구현하기 위해 선택에서 ASP.NET 웹 API, 그들은 도로에 반복적 인 코딩이 목표 교체를 많이 만들 기여, 가독성을 높이기 위해 사후 유지 보수 코드의 어려움을 줄일 수있다.

대부분의 시도 - 캐치 예외 처리는 일반적으로 같은 문구 (예외 로그 기록, 오류 메시지 등을 반환), 그래서 예외도 사용하지 않고, 발생했을 때 우리는 API 있도록 통합 된 필터를 쓸 수 try- 위치 중첩 예외 및 솔루션을 잡을 자동 원하는 예외 처리를 입력 할 수있다.


참고 :이 사용 된 웹 API에 대한 특히 글로벌 예외 핸들러입니다. 컨트롤러 경우 글로벌 예외 처리 메커니즘의 또 다른 세트를 가지고뿐만 아니라, 때문에 일반적으로 이렇게 페이지보기, 파일 파일, JSON 문자열과 관련된 정상적인 상황에서 MVC의 컨트롤러 반환 JSON 문자열.


시작을 얻기

여기에서 우리는 글로벌 예외 핸들러을 적용하는 방법을 설명하기 위해 예를 들어 필터 코드를 처리하는 간단한 예외가 있습니다 :


1. 클래스 MyExceptionFilterAttribute, 상속 ExceptionFilterAttribute, System.Web.Mvc.IExceptionFilter를 만들고 인터페이스 메소드를 구현


Newtonsoft.Json을 사용함;
System.Net.Http을 사용함;
System.Web.Http.Filters을 사용함;
System.Web.Mvc을 사용함;

WebAPITest.Filters 네임 스페이스
{
     공용 클래스 MyExceptionFilterAttribute : ExceptionFilterAttribute, System.Web.Mvc.IExceptionFilter는
     {
         // MVC 필터 상속은이 인터페이스 요구 사항은 등록 할 수 있어야합니다,하지만 우리는 달성 상속 할 수 있지만 쓰지 않습니다.
         OnException 공개 (ExceptionContext filterContext)를 무효
         {
             )은 (새 새로 만들기 NotImplementedException 던져;
         }

        // API는이 사람이 예외 인 경우 실제 글로벌 예외 필터가 적용됩니다 수 있습니다 :
         공공 무효 재정의 OnException (HttpActionExecutedContext actionExecutedContext)
         {
             base.OnException (actionExecutedContext);

            actionExecutedContext.Response = 새로운 HttpResponseMessage () {내용 = 새로운 StringContent ( "出现异常")};
             반환;

        }

}



2.이 등록을 글로벌 예외 핸들러를 종료 :

따라서 필터 효과를 확인하기 위해, 필터로서 등록 App_Start 아래 FilterConfig.cs 폴더를 연다.


특별 참고 사항 : 전 세계적으로 등록 된 후에는 예외가 발생하는 모든 필터가 적용됩니다.


공공 정적 무효 RegisterGlobalFilters (GlobalFilterCollection 필터)
{
     filters.Add (새 MyExceptionFilterAttribute ());
}



기능 태그로 사용

물론, 외부 세계 예외 필터에 등록 된 전술 MyExceptionFilterAttribute뿐만 아니라, 방법 자체가 "시도"입니다 참고 :( API를 특정 방법에 대해 단독으로 사용할 수 있고, 필터는 "캐치"입니다. 더 이상 생체 내에서 필요하지 않습니다 다시 시도 - 캐치)

System.Net.Http을 사용함;
System.Web.Http을 사용함;
WebAPITest.Filters을 사용함;
WebAPITest.Models을 사용함;

WebAPITest.Controllers 네임 스페이스
{
     // 당신은 또한 API 클래스의 모든 인터페이스 [MyExceptionFilter 허용] 예외 처리를했다하는 표현이 곳에서 태그 플레이를 필터링 할 수 있습니다.
     TestController 클래스 공개 : ApiController
     {
         여기에 재생 [MyExceptionFilter] // 기능 태그는 다음 왜냐하면 userexecption 치료 MyExceptionFilterAttribute의 특별한 방법은 예외를 트리거합니다.
         HttpResponseMessage 왜냐하면 userexecption 공개 ()
         {
             던져 새 새로 만들기 왜냐하면 userexecption ( "사용자 예외");
         }

        [MyExceptionFilter] // 위의이 기능은 예외로 SystemException이 레이블 거래를하는 데 도움이됩니다.
         HttpResponseMessage SystemException이) (공공
         {
             던져 새로운 새로운 예외 ();
         }

    }
}



우선 순위 문제와 라벨의 글로벌 등록

특성 복수의 태그가, 글로벌 레지스터는 메소드 이름 개별적 일 수 있고, 클래스 이름의 혼합물 글로벌 태그가 등록 된 후, 만약, 최종 처리는 단독 메소드 명 클래스 이름에 맞았다 다른 태그 인 또는 접근 방식은 트리거 될 것인가?

사실,이 녀석 우선 순위 및 우선 순위 CSS의 캐스 케이 딩 스타일 시트와 유사합니다.

즉 우리가 글로벌 필터 A를 등록하면,하지만 상단에있는 또 다른 B의 ApiController 클래스를 재생뿐만 아니라, 작업 방법에 세 번째 예외 핸들러 C를 재생, 디폴트 가장 가까운 작업 C를 실행합니다 ActionFilter> ClassFilter> GlobalFilter을 : 프로세서, 즉 말을하는 것입니다.

전군, 즉로 반복 필요한 경우에도 : 글로벌 한 번 컨트롤러 클래스 때 라벨 [AttributeUsage (AttributeTargets.All, AllowMultiple = TRUE), 그 트리거시 이상, 액션 한번 필요는 필터의 상단에 추가 그들은 여러 실행을 지원할 수있을 것입니다.

물론, 실제 예외 처리는 복잡한 내용을 많이 포함, 이것은 단지 개요입니다. 예를 들어, 리턴 값은 호출 예외 처리 도구는 GET / POST 요청에 대한 처리 방법에 이상 차이를 초래하는 서버 기록, 기록 요청 파라미터에 이상이 정보를 송신한다 (상태 코드, 메시지, 응답 컨텐츠의 흐름 등을 포함) 정규화 될 필요가있다.

그러나 우리는 아이디어가 더 많은 방법과 가능성을 실제로있을 수 있습니다 개발 효율성을 향상, 알려 코드를 간소화하는 것입니다 제공하기 위해 여기에 있습니다. 그리고 당신은 특정 단계가 반복되어 있는지, 그것은 초기 개발자가 솔루션을 제안 했어야하고, 당신이 그들을 찾을 필요가 느낄 때, 같은 방법을 사용할 필요가 없습니다.

추천

출처blog.51cto.com/14360220/2416919