문제

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;
}

이것에 대한 블로그 기사가 있습니다 여기

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top