2011-09-14 49 views
0

我正在開發.Net Webform應用程序,大量使用Web服務與外部服務器數據庫進行通信。Web服務重新連接模式

所以,我試圖找到調用WS方法時處理斷開和故障的最佳途徑。

現在,我已經取得了所有的WS方法我打電話,說重複循環的具體WS調用,直到它卡梅斯出一個成功的第一層的代理功能-kind。

對於這兩個同步和異步調用,我已經解決了我的問題,但我添加了一個惱人的額外層,以我的web層,用額外的維護,以及大量的冗餘代碼。

我不相信有沒有這種標準的情況已有的解決方案,但到處都找不到它。

什麼想法?

之後,我的額外層(同步)的例子:

public static int WsMethod(string param1, int param2) 
{ 
while(true) 
{ 
    try 
    { 
    return new Webpoint().WsMethod(param1, param2); 
    } 
    catch (Exception) 
    { 
    Thread.Sleep(new TimeSpan(0, 0, sleep_seconds)); 
    } 
} 
} 

和異步:

public static void WsMethodAsync(string param1, int param2, WsMethodCompletedEventHandler handler) 
    { 
     while (true) 
     { 
      try 
      { 
       var server = new Webpoint(); 
       server.WsMethodAsyncCompleted += delegate(object sender, WsMethodAsyncCompletedEventArgs args) 
       { 
        if (args.Error != null) 
        { 
         Thread.Sleep(new TimeSpan(0, 0, sleep_seconds)); 
         this.WsMethodAsync(param1, param2, handler); 
        } 
        else 
        { 
         handler(sender, args); 
        } 
       }; 
       server.WsMethodAsyncAsync(param1, param2); 
       return; 
      } 
      catch (Exception) 
      { 
       Thread.Sleep(new TimeSpan(0, 0, sleep_seconds)); 
      } 
     } 
    } 

回答

1

我不會推薦這種模式。如果您的通話中的參數有問題,這將永遠運行。 通常我會捕獲一些預期的異常(CommunicationException,SocketException,無論您需要什麼)並返回一些狀態代碼(Ok或NoNetwork或其他)。 或者將所有預期的異常包裝到MyCommunicationException中並拋出(隱藏調用者的實現細節並使異常處理更容易)

但是將控制權還給調用者並讓調用者決定如何去上。不要抓住其他意想不到的例外或重新拋出它們。

調用者可以決定嘗試一次又一次或3次或其他。

1

如果事情是真的錯了的服務,或與​​其連接,或請求而作出,那麼這將無限重複而沒有告訴你什麼是錯的。

服務調用失敗的含義是什麼?它多久真的會失敗?而且,最重要的是,對於原因它會失敗嗎?如果原因是可以解決的問題,則應該修正。沒有解決。

作爲一個簡單的例子,如果這個後端服務調用是由網站用戶發起的(例如,他們試圖獲取一些數據來編輯),那麼如果調用失敗,你只是提出一個錯誤用戶。例如:

「我很抱歉,此時數據不可用,支持團隊已收到此問題的通知,請再次嘗試您的請求。如果問題仍然存在,請聯繫幫助臺在800-555-1234。「

現在,這不應該只是一個單一的通用錯誤,無論發生什麼事情都會向用戶顯示。該代碼需要足夠強大以從另一個角度辨別某種錯誤。如果服務無法訪問,則會出現此錯誤。如果服務說這個請求是無效的,那麼用戶在做什麼或者你的代碼在做什麼都有問題,並且需要修復。等等

您如何處理錯誤並維護可用的應用程序最終取決於您和整個業務。但我誠實地不能推薦你在這個問題上提出的方法。這種方法並沒有解決任何問題,它只是在問題惡化之前忽略了問題。您需要確定錯誤的根源並解決該問題,而不是忽略它們。

此外,任何時候錯誤被抑制/忽略,一隻小貓死亡。

+0

David,Carsten,謝謝你的回覆。 我現在明白了,我應該確定所有與連接問題有關的異常,這些異常可能不是無限循環,而是n次重試,然後繼續。在所有其他異常/錯誤情況下將控制權歸還給調用者。 但是,雖然我會根據這個修改每個方法的代理函數,但我還是忍受着通用的冗餘代碼......有什麼想法嗎? – Tuk

+0

@Tuk:理想情況下,你不應該那樣做。代理應該做它目前的工作。調用代理的代碼可以捕獲異常並以任何您想要的方式處理它們。如果有幾種情況需要重新嘗試幾次,請確定這些情況並僅針對這些情況實施。但這不應該是一個目標。確保重試代碼也報告錯誤,以便可以識別和修復根本原因。 – David