2010-12-08 4 views
1

WCF 서비스에서 FaultException이 반환되면이를 종료하는 대신 채널을 중단해야합니다. 클라이언트와 서비스 모두이 접근 방식으로 잘 작동하지만 IErrorHandler를 서비스에 구현하고 예외를 기록한 후 클라이언트에서 Abort를 호출하면 서비스가 로그를 기록함을 알 수 있습니다.오류가 발생한 WCF 채널에서 중단을 호출하면 서버 측 오류가 기록됩니다.

System.ServiceModel.CommunicationException : 소켓 연결이 중단되었습니다 ...

서비스 정보를이 서비스 로그로 오염시키지 않고 서비스 관련 오류 만 기록하려고합니다. 나는 분명히 어떤 CommunicationExceptions의 로깅을 멈출 수 있지만 내 서비스는 다른 서비스의 WCF 클라이언트이기도하며 이러한 서비스로 인해 발생하는 CommunicationExceptions는 기록되어야합니다.

어떻게 그럴 수 있습니까?

+0

왜 종료하지 않을 것이라고 설명 할 수 있습니까? 그것은 당신에게 더 나은 대답을 얻을 수 있습니다. –

+0

예외가 발생한 후 채널에서 Close()를 호출하면 원래 예외를 마스킹하여 예외 자체가 throw되는 WCF의 잘 알려진 문제가 있습니다. 따라서 채널에 오류가 발생하면 Close()보다는 Abort()를 사용하십시오. 아래의 Tomas의 링크와 블로그 게시물에 인용 된 링크를 참조하십시오. –

답변

1

아무도이 질문에 대답하지 못했기 때문에 (토마스의 대답은 관련이 없었습니다.) 저는이 분야의 전문가 몇 명에게 물었습니다. 불행히도 이것을 막을 수있는 좋은 방법은 없으며 IErrorHandler에 논리를 추가하여 '소켓 연결이 중단되었습니다'라는 메시지로 CommunicationExcepions를 로깅하지 않도록하는 것이 좋습니다. 매우 우아하지는 않지만 작동합니다.

0

문제는 가능하면 처분 할 때 예외가 발생하면 기본 예외를 다루는 예외가 발생한다는 것입니다. 이와 같은 시나리오를 처리 할 래퍼를 작성했습니다. 내 블로그에서이 내용을 읽을 수 있습니다. http://blog.tomasjansson.com/2010/12/disposible-wcf-client-wrapper/

dispose 메서드가 예외를 throw하면 시나리오를 처리하는 채널 주위에 래퍼가 있습니다.

내 래퍼를 사용하는 방법의 작은 예 :

여기
public class ClientWrapperUsage : IYourInternalInterface 
{ 
    public IList<SomeEntity> GetEntitiesForUser(int userId) 
    { 
     using(var clientWrapper = new ServiceClientWrapper<ServiceType>()) 
     { 
      var response = clientWrapper.Channel.GetEntitiesForUser(); 
      var entities = response.YourListOfEntities.TranslateToInternal(); 
      return entities; 
     } 
    } 
} 

나는 그것이 서비스에 의해 반환되는 개체가 포함 된 목록에 대한 확장 방법을 기존 가정 한, 당신은 것을 사용 메서드를 사용하여 내부 엔터티로 변환합니다. 이것은 적어도 100 % 테스트 할 수 있습니다. :) 그냥 모크 인터페이스 IYourInternalInterface 어디서나 당신은 서비스를 위장하지 않으려 고합니다.

+0

그건 문제가되지 않습니다. 이 코드는 완벽하게 작동하고 올바른 클라이언트 예외를 생성합니다. 문제는 SERVICE가 클라이언트가 채널을 중단했다는 추가 오류를 기록한다는 사실입니다. 내 프록시에서 예외가 발생했을 때 중단보다는 중단을 호출하는 코드와 유사한 코드가 있으며이 코드는 실제로 서비스에 여분의 로그를 발생시킵니다. 서비스에 IErrorHandler를 구현하지 않으면이 문제가 보이지 않지만 실제로는 서비스 오류 로그가 오염되어 실제 오류를 읽지 못하게됩니다. –

+0

그런데 ServiceClientWrapper를 사용하는 코드는 단위 테스트 할 수 없다는 점에서 블로그의 접근 방식에 문제가 있습니다. 이 접근법을 살펴 보길 원할 것입니다. http://favcode.net/browse/using_castle_dynamic_proxy_to_create_a_wcf_proxy_via_channelfactory - IMHO가 실제로 잘 작동합니다. 이 코드는 Castle Dynamic Proxy를 사용하기 때문에 약간 복잡하지만 보통 클래스처럼 프록시를 처리하면 장점이 있습니다. 나는 당신의 블로그에 이것을 넣으려고했으나 스팸으로 표시되었다! –

+0

중단 할 때 예외가 발생합니까? 아니면 언제 예외가 있습니까?래퍼를 사용하고 있습니까? 코드를 사용하여 질문을 업데이트하십시오. 그러면 질문에 대답 할 수있게됩니다. –

관련 문제