2008-10-21 4 views
4

클라이언트에 전달되기 전에 서비스 경계에 도달하는 모든 예외를 기록하기 위해 내 WCF 서비스에 IErrorHandler를 구현하려고합니다. 나는 이미 유용한 F 형 예외 (Exceptions)를 형식화 된 FaultExceptions로 변환하기 위해 IErrorHandlers를 사용합니다. IErrorHandler.HandleError()에 대한 MSDN에 따르면이 메서드는 경계에서 로깅하는데도 사용됩니다.서비스 경계에서 WCF 오류 로깅

문제는 HandleError 함수가 작업 스레드에서 호출되지 않을 수 있으므로 예외를 트리거 한 연산에 대한 정보를 얻는 방법을 파악할 수 없다는 것입니다. 예외 사이트 자체에서 TargetSite를 얻을 수는 있지만 작업 대신 내부 메서드가 제공됩니다. 또한 StackTrace 문자열을 통해 구문 분석하여 어디에서 던져 졌는지 파악할 수 있지만이 방법은 조금 허약하고 깨지기 쉬운 것으로 보입니다. HandleError 함수에서 상태 정보 (메시지, 작업 설명, 기타)를 얻는 일관되고 지원되는 방법이 있습니까? 또는 서비스 호출에 대한 예외를 자동으로 기록하는 다른 방법은 있습니까?

SvcTraceViewer가 기존의 로깅 프레임 워크를 사용하여 프로덕션 환경에서 구현할 솔루션을 찾고 있습니다.

감사합니다.

답변

3

IErrorHandler.ProvideFault()에 IErrorHandler.HandlerError() 대신 로깅을 추가했습니다. 작업 스레드에서 ProvideFault 호출이 이루어 지므로 OperationContext.Current를 사용하여 일부 정보를 기록 할 수 있습니다.

2

설명과 동일한 방식으로 IErrorHanlder를 사용하지만 로깅은 사용하지 않습니다. 서비스 클래스 (WCF인지 아닌지) 대신에 나는 here과 같은 인터셉터를 사용합니다. 이 기술을 사용하면 관심있는 정보를 얻을 수 있습니다.

+0

AOP는 항상 나를 괴롭 히지만 여기에서 매우 적용됩니다. 공유해 주셔서 감사합니다. – smaclell

0

들어오는 호출 스레드에서 ProvideFault() 작업이 호출되고 있으며 클라이언트는 여전히 응답 대기 중으로 차단됩니다. 나는이 방법 안에 긴 프로세스 (로깅과 같은)를 추가하는 것은 좋은 생각이라고 생각하지 않는다. 그래서 그들은 별도의 작업자 스레드에서 호출되는 HandleError 작업을 노출 시켰습니다.

하지만 귀하의 상황을 이해합니다. ProvideFault에 로그인하는 것 이외의 솔루션을 찾은 경우 공유하십시오.

0

인스턴스를 만들고 해당 인스턴스에 요청 메시지를 저장하는 방법은 무엇입니까?

2

조작 스레드에서 호출되는 ProvideFault 메소드의 Exception 's Data 딕셔너리에 로그인하는 데 필요한 컨텍스트 정보를 숨길 수 있습니다 ... 그런 다음이를 로깅 목적으로 HandleError 메소드에서 참조하십시오.