2011-08-10 14 views
2

我正在使用客戶端代理對象來訪問WCF頻道。要訪問任何服務方法,該調用將被包裝在try-catch中以確保定義良好的行爲。我應該如何重新打開一個失敗的WCF頻道?

但是,一旦通道因任何原因無法使用,我想重新打開它。什麼是正確的方法來做到這一點?我看到兩個問題:

1.當在通過該故障,中止等接入方式

  • 的try/catch語句前右檢查

    • 通道的事件

    2.如何執行重新打開

    這讓我很困擾一點點。如果我理解正確的情況,我必須分別處理每種可能的狀態。另外,如果同時收到兩個方法調用(只適用於前一點的選項A),可能必須避免線程問題,例如打開通道兩次。

    我記得重新打開頻道時需要考慮很多事情。它需要區分Faulted和Closed(和Closing),操作順序很重要,某些操作會使對象(?)無效。

    而且,如果這沒有足夠的麻煩,MSDN顯然提供了錯誤的示例代碼(缺少的情況下,sloppily處理邊緣條件等),所以我不能依靠這一點。

  • 回答

    2

    通道無法重新打開。一旦通道處於Faulted狀態,唯一有效的狀態轉變是呼叫Abort。一旦您中止當前的通道/代理,您可以啓動新的通道並建立到服務器的新連接。

    +0

    不知道你看過他的問題一路過關斬將。他只想考慮一個案例是Faulted。你將如何處理其他案件? –

    +1

    @Lucas:任何其他情況都是一樣的 - 頻道不能重新打開。一旦頻道出現故障,關閉或關閉,它就消失了。 –

    0

    以供參考,這是我目前使用的:如果

    class FooProxy : IFoo 
    { 
        private readonly object _Sync = new object(); 
        private IFoo Channel; 
    
        public FooProxy() 
        { 
        } 
    
        private void CreateChannel() 
        { 
         lock (_Sync) { 
          if (Channel != null) { 
           if (((ICommunicationObject) Channel).State == CommunicationState.Opened) { 
            return; 
           } 
          } 
    
          // Attempt to create new connection 
          var factory = new ChannelFactory<IFoo> (...); 
          var channel = factory.CreateChannel(); 
    
          ((ICommunicationObject) channel).Faulted += (s, e) => ((ICommunicationObject) Channel).Abort(); 
    
          try { 
           ((ICommunicationObject) channel).Open(); 
          } 
          catch (EndpointNotFoundException) { 
           // dont worry 
           return; 
          } 
    
          Channel = channel; 
         } 
        } 
    
        public string DoStuff() 
        { 
         // try to create a channel in case it's not there 
         CreateChannel(); 
    
         try { 
          return Channel.DoStuff(); 
         } 
         // something goes wrong -> ensure well defined behavior 
         catch (CommunicationException ex) { 
          return null; 
         } 
        } 
    } 
    
    相關問題