2009-08-06 6 views
14

WCF 웹 서비스를 통해 메시지를 보내기 위해 10 초마다 시도하는 클라이언트 응용 프로그램이 있습니다. 이 클라이언트 응용 프로그램은 선상에있는 컴퓨터에 설치되며, 우리는 인터넷 연결이 불안정하다는 것을 알고 있습니다. 응용 프로그램이 서비스를 통해 데이터를 보내려고하고, 불가능할 경우 메시지를 서비스를 통해 보낼 수있을 때까지 큐에 대기시키고 싶습니다.WCF의 CommunicationObjectFaultedException에서 복구

이 설정을 테스트하기 위해 클라이언트 응용 프로그램과 웹 서비스 (로컬 컴퓨터 모두에서)를 시작하고 모든 것이 올바르게 작동합니다. 웹 서비스를 종료하고 다시 시작하여 잘못된 인터넷 연결을 시뮬레이트하려고합니다. 서비스를 종료하자마자 CommunicationObjectFaultedExceptions가 발생하기 시작합니다. 그러나 서비스를 다시 시작한 후에도 예외는 계속 발생합니다.

저는 웹 서비스 패러다임에 대해 이해하지 못하는 것이 있지만 그게 무엇인지 모르겠습니다. 이 설정이 가능한지 여부에 대한 조언을 누구든지 제공 할 수 있습니까? 그렇다면이 문제를 해결하는 방법 (예 : 웹 서비스와 통신 채널 다시 설정)

감사합니다. 그들이 오류가 발생한 일단

Klay

답변

33

클라이언트 서비스 프록시는 재사용 할 수 없습니다. 이전 버전을 폐기하고 새 버전을 다시 만들어야합니다.

또한 클라이언트 서비스 프록시를 올바르게 닫아야합니다. WCF 서비스 프록시가 닫을 때 예외를 throw 할 수 있으며 연결이 끊어지지 않으면 중단해야합니다. "try {Close}/catch {Abort}"패턴을 사용하십시오. 또한 dispose 메서드는 close를 호출하므로 처분에서 예외를 throw 할 수 있으므로 일반 일회용 클래스처럼 사용하는 것은 불가능합니다. 예를 들어

는 :

try 
{ 
    if (yourServiceProxy != null) 
    { 
     if (yourServiceProxy.State != CommunicationState.Faulted) 
     { 
      yourServiceProxy.Close(); 
     } 
     else 
     { 
      yourServiceProxy.Abort(); 
     } 
    } 
} 
catch (CommunicationException) 
{ 
    // Communication exceptions are normal when 
    // closing the connection. 
    yourServiceProxy.Abort(); 
} 
catch (TimeoutException) 
{ 
    // Timeout exceptions are normal when closing 
    // the connection. 
    yourServiceProxy.Abort(); 
} 
catch (Exception) 
{ 
    // Any other exception and you should 
    // abort the connection and rethrow to 
    // allow the exception to bubble upwards. 
    yourServiceProxy.Abort(); 
    throw; 
} 
finally 
{ 
    // This is just to stop you from trying to 
    // close it again (with the null check at the start). 
    // This may not be necessary depending on 
    // your architecture. 
    yourServiceProxy = null; 
} 

here

+0

10에 대한 블로그 글이 내가 할 수있는 경우 - 월드 오브 워크래프트 -이 동작은 무슨 일이 있었는지 밖으로 일 못했네, 레이더 아래에 전적으로 이 답을 찾지 못했다면. –

+0

브라보! 확장 메서드로이 버전을 구현했습니다. 다른 클래스에서 사용할 수 있도록 프록시 클래스에서 TryDispose를 수행합니다. –

+0

@ Moby 's Stunt Double - 코드를 공유 할 수 있습니까? – RichardHowells