WCF의 CommunicationObjectFaultEdException에서 복구
문제
10 초마다 WCF 웹 서비스를 통해 메시지를 보내려고하는 클라이언트 앱이 있습니다. 이 클라이언트 앱은 선박에 탑승 한 컴퓨터에있을 것입니다. 앱이 서비스를 통해 데이터를 보내려고하고, 그렇지 않은 경우 서비스를 통해 보낼 수있을 때까지 메시지를 대기시켜줍니다.
이 설정을 테스트하기 위해 클라이언트 앱과 웹 서비스 (로컬 컴퓨터 모두)를 시작하고 모든 것이 잘 작동합니다. 웹 서비스를 죽이고 다시 시작하여 인터넷 연결이 잘못된 인터넷 연결을 시뮬레이션하려고합니다. 서비스를 죽이자 마자 CommunicationObjectFaultEdExceptions를 시작합니다. 그러나 서비스를 다시 시작한 후에도 그 예외를 계속받습니다.
나는 웹 서비스 패러다임에 대해 이해하지 못하는 것이 있다고 확신하지만 그것이 무엇인지 모르겠습니다. 누구나이 설정이 실현 가능한지 여부에 대한 조언을 제공 할 수 있으며, 그렇다면이 문제를 해결하는 방법 (즉, 웹 서비스와 통신 채널을 다시 설립).
감사!
클레이
해결책
클라이언트 서비스 프록시는 결함이 발생하면 재사용 할 수 없습니다. 오래된 것을 처분하고 새로운 것을 재현해야합니다.
또한 클라이언트 서비스 프록시를 올바르게 닫아야합니다. WCF 서비스 프록시가 예외를 닫을 수 있으며, 이런 일이 발생하면 연결이 닫히지 않으므로 중단해야합니다. "try {close}/catch {abort}"패턴을 사용하십시오. 또한 Dispose 메소드 호출을 가까이에서 닫기 (따라서 Dispose에서 예외를 던질 수 있음)를 명심하십시오. 따라서 일반 일회용 클래스와 같은 사용을 사용할 수는 없습니다.
예를 들어:
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;
}
이것에 대한 블로그 기사가 있습니다 여기