내용 보기

작성자

관리자 (IP : 172.17.0.1)

날짜

2020-07-09 08:14

제목

[WCF] Global Level에서 Exception 처리 또는 기록


                  :

서문

Applcation에서 발생한 Exception을 분석하고 처리하기 위해 Exception을 파일로 기록하려는 경우, 모든 Try, Catch에 Exception을 기록하는 로직을 두는 것은 여간 괴로운 일이 아닙니다. 이러한 코드 작성 방식은 시스템 유지보수에 있어서 더 치명적입니다. 여기에서는 WCF에서 발생하는 Exception을 OS의 EventLog에 기록하는 클래스를 작성하고 WCF Service에 부여하는 방법에 대해서 소개할 것입니다.

Exception을 기록하는 것 뿐만 아니라, Application 전역에서 발생하는 모든 Exception에 대해서 특정한 동작을 부여하고 싶을 분들에게 이 포스트가 도움이 될 수 있습니다.

구현

이 기능의 구현은 WCF를 확장하는 몇 가지 Interface를 구현하고 Web.Config에 설정을 추가하는 것만으로 실현될 수 있습니다.

  1. IErrorHandler Interface를 구현하여 에러 처리기를 작성합니다. 
    01using System;
    02using System.ServiceModel.Dispatcher;
    03using System.ServiceModel.Channels;
    04using System.Diagnostics;
    05 
    06/// <summary>
    07/// 이벤트 처리기
    08/// </summary>
    09public class ErrorHandler : IErrorHandler
    10{
    11    public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
    12    {
    13        //이 Method는 Exception을 Fault로 바꾸고자 할 때 사용합니다.
    14    }
    15    public bool HandleError(Exception error)
    16    {
    17        //1. EventSource 생성
    18        if (!EventLog.SourceExists("NakedStrength"))
    19            EventLog.CreateEventSource("NakedStrength""Application");
    20 
    21        //2. Exception 쓰기
    22        EventLog.WriteEntry("NakedStrength", error.ToString());
    23        return false;
    24    }
    25}
    HandleError Method는 Exception이 발생할 때마다 실행될 것입니다. 마지막에 return false;를 통해 Exception이 Handle되지 않도록 하였습니다.
  2. 동작중인 각 Service에 위에서 작성한 ErrorHandler를 추가하는 Service Behavior의 작성이 필요합니다. 이 것은 IServiceBehavior Interface를 상속함으로서 구현가능합니다.
    01using System;
    02using System.ServiceModel.Description;
    03using System.ServiceModel;
    04using System.Collections.ObjectModel;
    05using System.ServiceModel.Channels;
    06using System.ServiceModel.Dispatcher;
    07 
    08/// <summary>
    09/// ErrorHandler를 모든 Service Channel에 적용하는 ServiceBehavior
    10/// </summary>
    11public class ErrorServiceBehavior : IServiceBehavior
    12{
    13    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    14    {
    15 
    16    }
    17    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
    18    {
    19 
    20    }
    21    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    22    {
    23        ErrorHandler handler = new ErrorHandler();
    24        foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers)
    25            dispatcher.ErrorHandlers.Add(handler);
    26    }
    27}
    ApplyDispatchBehavior Method에서 위에서 작성한 ErrorHandler를 생성하여 동작 중인 ServiceChannel에 추가하고 있습니다.
  3. 이제 위에서 생성한 Service Behavior를 Web.Config에 추가하기 위해 Extension Element을 생성해야 합니다.
    01using System;
    02using System.ServiceModel.Configuration;
    03 
    04/// <summary>
    05/// 생성한 ErrorServiceBehavior를 Web.Config에 추가히기 위해 확장엘리먼트로 생성
    06/// </summary>
    07public class ErrorHandlerBehavior : BehaviorExtensionElement
    08{
    09    protected override object CreateBehavior()
    10    {
    11        return new ErrorServiceBehavior();
    12    }
    13    public override Type BehaviorType
    14    {
    15        get
    16        {
    17            return typeof(ErrorServiceBehavior);
    18        }
    19    }
    20}
  4. 마지막으로 WCF의 Web.Config의 <system.serviceModel> Element를 다음과 같이 구성합니다.
    01<system.serviceModel>
    02    <extensions>
    03        <behaviorExtensions>
    04            <!-- Exception Log 기능 추가 -->
    05            <add name="ExceptionLogger" type="Dispatch.Service.ErrorHandlerBehavior, Dispatch.Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
    06        </behaviorExtensions>
    07    </extensions>
    08 
    09       .. 기타 노드
    10 
    11</system.serviceModel>

결과

이로서 모든 설정은 마쳤습니다. 이제 Exception을 발생시키면 다음과 같이 Event Log에 기록으로 남을 것입니다. OS의 Event View를 통해 확인하면 다음과 같습니다.

 

Event Logging에 대한 더 자세한 정보

http://msdn.microsoft.com/ko-kr/library/k00ce235.aspx

출처1

http://nsinc.tistory.com/17

출처2