WCF中的狀態變遷和重連


在WCF程序中,當我們使用tcp等雙向連接的時候,我們往往需要感知到客戶端和服務器的連接狀態,並且實現斷線重連,從而維持一個長連接。本文就簡單的介紹一下如何實現這一操作:

WCF所有的客戶端程序都繼承自ClientBase類,它有一個State屬性,用來表示當前的狀態,這個狀態的變遷過程如下:

    

  1. 當通過new函數新建客戶端時,其處於create狀態,由於此時還沒有與服務器通信,即使server段不可用,新建對象不會拋異常。
  2. 新建客戶端后,當我們調用服務函數時,會隱式使用Open函數建立與服務器的鏈接,此時客戶端進入Opened狀態,也就是我們正常工作時的狀態。
  3. 當調用結束后,可以通過Close或Abort函數主動關閉,從而進入Closing狀態
  4. 當出錯后,會進入Fault狀態,此時則就要進行重連操作了。

從圖中可以看到,裝個狀態機的變遷過程是不可逆的:一旦進入Fault狀態,無法通過某個成員函數把它重置為Opened狀態。也就是說,重連只能通過重新new客戶端來實現

既然知道了如何重連,下一步的問題就是該在什么時候重連:一個簡單的方法就是啟動一個計時器定期判斷Client狀態,如果處於Faulted狀態則。不過除了這種比較土的辦法外,更好的方式是訂閱Client狀態變化通知。

直接從Client的成員函數看,是沒有針對狀態變化的事件的。實際上ClientBase是繼承自ICommunicationObject的,而ICommunicationObject是有狀態變化通知事件的。只不過由於是隱式繼承,導致默認情況下看不到罷了。

  

代碼比較簡單,這里就不列舉了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM