2012-07-12 59 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的新手,也許我正在考慮太多的東西是套接字式的,但我希望我的客戶端繼續重試,直到端點變得可用或可以找到,並以某種方式發起關聯事件或沿着這些線路發生的事情。

+0

運行服務託管或不託管測試,以及新建「後創建」的狀態,無論服務是否啓動。如果服務處於啓動狀態,則在第一次方法調用後(但不是在此之前),它的狀態爲「打開」。 – Paparazzi 2012-07-12 17:43:25

+0

我也注意到,如果你在_proxy.Open()之前設置斷點,看看_proxy的內部成員,然後允許代碼繼續並運行Open,最後將返回InvalidOperationException。看起來這是因爲調試器評估了一些導致副作用的屬性。 – Monsignor 2014-01-10 11:50:59

回答

4

由於EndpointNotFoundException,您可能會看到類似於「沒有端點在...處偵聽...」的消息。發生什麼事情是,在while循環期間,您在第一遍時打開代理,處理錯誤,然後在第二遍時獲得InvalidOperationException,它說:「通信對象System.ServiceModel.Channels.ServiceChannel不能在它處於打開狀態時進行修改「。

如果您中止現有代理上的連接,您將無法使用它進行通信。一旦關閉連接,代理對象將被處置。解決方案是關閉現有代理並創建一個新代理。我已經更新了以下代碼:

_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(); to _proxy.Abort();否則它會給我一個關於無法改變狀態的例外。 – JamesK89 2012-07-12 18:12:50

+0

很高興聽到它幫助!我相應地更新了我的答案。 – 2012-07-12 18:36:21

+0

現在即時通知此異常 – skhurams 2016-01-01 14:29:05