2012-07-12 2 views
3

진행하기 전에 대기하거나 서비스 호출을 허용하기 위해 대기 할 WCF 프록시 클래스를 얻는 방법을 알아 내려고하고 있습니다. WCF 프록시 클라이언트가 준비 될 때까지 기다리는 방법?

나는이 같은 시도 :

_proxy = new WCFBlackjack(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/blackjack/IWCFBlackjack")); 

    while(!_proxy.State.Equals(CommunicationState.Opened)) { 
     if(!_proxy.State.Equals(CommunicationState.Opening)) { 
      try { 
       _proxy.Open(); 
      } catch(EndpointNotFoundException enfe) { 
       /* ... */ 
      } 
     } 
     System.Threading.Thread.Sleep(1); 
    } 

을하지만 분명히 그 그렇지 않으면 내가 여기되지 않을 것 작동하지 않습니다. 처음에는 작동하지만 ChannelFactory는 open 문에 InvalidOperationException을 발생시킵니다.

나는 WCF에 익숙하지 않고 소켓 - 에스 쿠크 (Sockets-esque)의 라인을 너무 많이 생각하고있다. 그러나 엔드 포인트를 사용할 수있게되거나 찾을 수있을 때까지 클라이언트가 계속 시도하기를 원한다. 연결되어있는 이벤트 또는 그 라인을 따라 무언가를 발사하십시오.

+0

서비스가 실행 중인지 여부에 관계없이 서비스 호스팅 여부와 새로운 상태가 "생성 됨"상태인지 확인하십시오. 서비스가 작동중인 경우 첫 번째 메소드 호출 이후 Open 상태가됩니다 (그러나 전에는 그렇지 않습니다). – Paparazzi

+0

_proxy.Open() 전에 중단 점을 설정하고 _proxy의 내부 멤버를보고 코드를 계속 실행하고 Open을 실행하면 마지막으로 InvalidOperationException이 반환됩니다. 디버거가 부작용을 유발하는 일부 속성을 평가하기 때문입니다. – Monsignor

답변

4

EndpointNotFoundException을 사용하면 "수신 할 엔드 포인트가 없습니다 ..."와 같은 메시지가 표시됩니다. 일어나는 일은 while 루프 중에 첫 번째 전달에서 프록시를 열고 오류를 처리 한 다음 두 번째 전달에서 "Communication Object, System.ServiceModel.Channels.ServiceChannel, 할 수 없습니다."라는 InvalidOperationException이 발생합니다. Opened 상태에서 수정 될 수 있습니다. "

기존 프록시에서 연결을 중단하면 앞으로의 통신에이 프록시를 사용할 수 없습니다. 연결을 닫으면 프록시 개체가 삭제됩니다. 해결 방법은 기존 프록시를 닫고 새 프록시를 만드는 것입니다. 아래 코드를 업데이트했습니다 :

_proxy = new WCFBlackjack(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/blackjack/IWCFBlackjack")); 

while(!_proxy.State.Equals(CommunicationState.Opened)) { 
    if(!_proxy.State.Equals(CommunicationState.Opening)) { 
     try { 
      _proxy.Open(); 
     } catch(EndpointNotFoundException enfe) { 
      /* ... */ 
      _proxy.Abort(); 
      _proxy = new WCFBlackjack(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/blackjack/IWCFBlackjack")); 
     } 
    } 
    System.Threading.Thread.Sleep(1); 
} 
+0

설명해 주셔서 감사합니다. 한 노트 비록 내가 _proxy.Close() 변경했다; ~ _proxy.Abort(); 그렇지 않으면 상태를 변경할 수 없다는 예외가 생깁니다. – JamesK89

+0

도움이 된 것을 기쁘게 생각합니다! 그에 따라 내 대답을 업데이 트되었습니다. –

+0

이제이 예외가 발생합니다. – skhurams

관련 문제