2016-02-12 102 views
0

讓我們假設我有WCF服務和一個客戶端,它使用給定服務中的某些方法。 在客戶和服務交流期間,如何處理各種異常的帖子有很多。只有這仍然是困惑我的事情是以下情況:如何處理WCF連接失敗

服務:

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    bool ExportData(object data); 
} 
public class Service1 : IService1 
{ 
    public bool ExportData(object data) 
    { 
     // Simulate long operation (i.e. inserting data to the DB) 
     Thread.Sleep(1000000); 
     return true; 
    } 
} 

客戶:

class Program 
{ 
    static wsService1.Service1Client client1 = new wsService1.Service1Client(); 

    static void Main(string[] args) 
    { 
     object data = GetRecordsFromLocalDB(); 

     bool result = client1.ExportData(data); 

     if (result) 
     { 
      DeleteRecordsFromLocalDB(); 
     } 
    } 
} 

客戶從本地數據庫得到了一些數據,並將其發送給服務器。如果結果成功,則客戶端將從本地數據庫中刪除導出的行。現在想象一下,當數據已經發送到服務器時,突然連接失敗(即WiFi被斷開)。在這種情況下,數據在服務器端成功處理,但客戶端永遠不知道它。是的,我可以捕捉連接異常,但我仍然不知道該如何處理本地數據庫中的記錄。我稍後可以再次發送這些數據,但是我會在服務器數據庫上重複一次(即在遠程數據庫上允許複製),但我不想多次發送相同的數據。

那麼,我的問題是如何處理這種情況?什麼是最佳實踐? 我查了一些關於asynchronous operations.的信息但是這仍然是關於什麼時候我有穩定的連接。 作爲解決方法,我可以將我的導出操作存儲在某個GUID的remotelly下,並稍後檢查此GUID的狀態。唯一的事情是我無法更改遠程數據庫。所以,請說明一下,在我的情況下哪個更好?

回答

1

這裏有幾點需要考慮

  1. 在服務器端你可以捕捉各種錯誤的(定製類派生IErrorHandler)和客戶提供特定的錯誤讓他知道錯誤的原因。
  2. 服務的概念是它是客戶端和數據庫之間的一種中介,所以客戶端爲什麼要檢索數據然後發送給服務?
  3. 一個出路是使用交易,確保如果發生錯誤,則不會保留更改。

順便說一句,如果您希望服務拋出異常,請不要創建全局服務對象,因爲它最終會處於故障狀態。改爲爲每一個調用創建一個新實例(使用using語句來處理它的實例)。 Bool返回類型不提供有關錯誤的廣泛信息(如果發生的話)。讓它具有void返回類型並在try/catch塊中進行換行,以便更多地瞭解錯誤的來源和性質。

+0

通常,WCF服務會在'FaultException'中返回異常詳細信息,而不是向客戶端暴露全局'IErrorHandler'對象(如果服務器關閉,它們將無法到達)。 https://msdn.microsoft.com/en-au/library/ee942778.aspx – MickyD