在WCF程序中,當我們使用tcp等雙向連接的時候,我們往往需要感知到客戶端和服務器的連接狀態,並且實現斷線重連,從而維持一個長連接。本文就簡單的介紹一下如何實現這一操作:
WCF所有的客戶端程序都繼承自ClientBase類,它有一個State屬性,用來表示當前的狀態,這個狀態的變遷過程如下:
-
當通過new函數新建客戶端時,其處於create狀態,由於此時還沒有與服務器通信,即使server段不可用,新建對象不會拋異常。
-
新建客戶端后,當我們調用服務函數時,會隱式使用Open函數建立與服務器的鏈接,此時客戶端進入Opened狀態,也就是我們正常工作時的狀態。
-
當調用結束后,可以通過Close或Abort函數主動關閉,從而進入Closing狀態
-
當出錯后,會進入Fault狀態,此時則就要進行重連操作了。
從圖中可以看到,裝個狀態機的變遷過程是不可逆的:一旦進入Fault狀態,無法通過某個成員函數把它重置為Opened狀態。也就是說,重連只能通過重新new客戶端來實現。
既然知道了如何重連,下一步的問題就是該在什么時候重連:一個簡單的方法就是啟動一個計時器定期判斷Client狀態,如果處於Faulted狀態則。不過除了這種比較土的辦法外,更好的方式是訂閱Client狀態變化通知。
直接從Client的成員函數看,是沒有針對狀態變化的事件的。實際上ClientBase是繼承自ICommunicationObject的,而ICommunicationObject是有狀態變化通知事件的。只不過由於是隱式繼承,導致默認情況下看不到罷了。
代碼比較簡單,這里就不列舉了。