2009-10-13 4 views
1

일부 WCF 서비스와 통신하기 위해 NetTcp 바인딩을 사용하는 프로젝트 작업 중입니다. 첫째 밖으로 시작할 때 우리는 WCF는 사용하여 호출 만들어 다른 응용 프로그램에서 나쁜 연습 예를했다 다음 우리는 WCF는 영문 페이지로 전송되었던 경우에도 연결 잡고 깨달았다까지 큰 일WCF 오류 로깅

EntityObject sample = new ServiceProxy().GetEntity(); 

클라이언트 (나는 순결하게 모든 연결을 정리할 것이라고 가정). ELMAH는 결국 연결이 끊어짐에 따라 오류를 기록하고 스택 추적을 보냈습니다. 성능 문제를 해결하기 위해 다음과 같이 변경했습니다.

using (ServiceProxy proxy = new ServiceProxy()) 
{ 
    sample = proxy.GetEntity(); 
} 

이렇게하면 성능이 상대적으로 좋았습니다. 이 방법의 단점은 프록시에서 오류가 수신 될 때마다 ELMAH가 포착 할 수있는 유일한 점은 채널에 오류가 발생했다는 것입니다. 그런 다음 클라이언트와 서버 모두에서 리스너를 설정 했음에도 불구하고 실제로 일어난 일을 파악할 수있는 로그 (serialListener가있는 WCF 설치 프로그램)를 조사해야합니다. 나는 IErrorHandler 인터페이스를 탐구했고 서비스에 대한 지원을 추가 할 예정이지만 WCF에서 자세한 오류를 가져 오는 다른 방법이 있는지 궁금하다. 잘못했다. 직렬화 할 수없는 이유를 알려주는 객체를 직렬화 할 때 죽으면 특히 유용합니다.

답변

1

프록시에서 Close()를 명시 적으로 호출하여 try-catch에 넣어두면 원하는 것을 얻을 수 있다고 생각합니다.

특히이 샘플을 참조하십시오 :

http://msdn.microsoft.com/en-us/library/aa355056.aspx

+0

정확히 찾고있는 것과 같습니다. 도와 주셔서 감사합니다. – RubyHaus

1

글쎄, 당신은 serviceDebug 동작을 사용하여 그냥 "나쁜 일이 무엇인가"보다 더 많은 정보를 다시 보내도록 WCF의는 죽을 말할 수 있습니다.

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="ExceptionDetails"> 
      <serviceDebug includeExceptionDetailInFaults="True" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 

개발자/테스트 환경 또는 사내 응용 프로그램 인 한 괜찮습니다. 하지만 실제로 서비스 오류는 서버 측에서 캐치 (및 기록)되어야합니다. IErrorHandler 인터페이스로 올바른 경로에 있습니다.

클라이언트는 보안 예외 또는 네트워크가 다운되는 것을 처리하기 위해 TimeoutExceptionCommunicationException과 같은 클라이언트 쪽 예외를 처리해야합니다. .NET 표준 예외 처리.

using() 또한 좋은 생각입니다. ServiceProxy가 처리 될 때 예외가 발생할 수 있기 때문에 (일반적으로 using() {} 블록 끝) 캐치되지 않습니다. 이 경우에. 대신 서비스 프록시에 try {...} catch {...} finally {...} 블록을 사용해야 할 수도 있습니다.

마크

+0

우리는 실제로 includeExceptionDetailInFaults 플래그를 사용하고 있습니다. 예외는 디버그로 되돌아옵니다. 그러나 오류는 프록시가 오류를 일으켰다는 사실에 의해 덫을 놓습니다. 그래서 우리가 보는 모든 것은 추가 정보없이 오류가 발생한다는 것입니다. try/catch는 옵션 일 수 있지만 현재 모든 것을 변경하는 것은 재미 있지 않을 것입니다. 나는 그것을 조금 탐험해야 할 것이다. – RubyHaus