2010-03-26 75 views
1

我正在使用C#的Web服務,並且Web服務需要登錄呼叫,然後使用Cookie會話。 Web服務將在一段時間後超時,之後客戶端將不得不重新登錄。我想找到一種方法來自動捕獲服務在此場景中發送的soap故障,並通過重新登錄然後重試以前嘗試的呼叫來處理它。如果認證失敗需要重新登錄,請重試Web服務呼叫

我寧願自動爲所有有問題的Web服務方法自動執行此操作,而不必使用重試邏輯手動包裝調用。

對此提出建議?

+0

什麼樣的Web服務客戶端? 「添加Web引用」(ASMX)或「添加服務引用」(WCF)?這對於WCF客戶端來說會更容易。 – 2010-03-26 01:58:52

+0

這是一個常規的Web引用。我們很遺憾地堅持使用.NET 2.0(現在) – Pete 2010-03-29 16:45:17

回答

2

爲了避免類似的問題,我實際上偶爾會「碰到」服務(我在另一端控制了服務,並創建了一種非常輕便的「ping」方法,但即使有簡單的東西,您也可以使用,這不會構成拒絕服務!)

我想我每隔2到5分鐘左右,它將取決於Web服務配置等......這樣的身份驗證問題從來沒有真正發生過,我做了如果你確實需要

- 不需要做時髦自動重新登錄的事情:-)

- 否則...重新登錄我會將整個事情包裝在一個界面中,無論如何,這是一個很好的實踐,可以將它們存根出來。 設計一個帶有效用方法的類來處理登錄,你會發現它很難以避免重新打字很多電話,但這就是它的方式!

例....

public interface ISomeService 
{ 
    string Method1(); 
    string Method2(); 
} 

public class ReLoginWebService : ISomeService 
{ 
    readonly WebServiceProxy _proxy; 
    string _username; 
    string _password; 

    public ReLoginWebService(string username, string password) 
    { 
     _username = username; 
     _password = password; 
     _proxy = new WebServiceProxy(); 
     Login(); 
    } 

    public string Method1() 
    { 
     try 
     { 
      _proxy.Method1(); 
     } 
     catch (Exception exp) // filter appropriately... 
     { 
      // if its a login error... 
      if (Login()) 
       _proxy.Method1(); 
      else 
       throw; 
     } 
     return ""; 
    } 


    public string Method2() 
    { 
     try 
     { 
      _proxy.Method2(); 
     } 
     catch (Exception exp) // filter appropriately... 
     { 
      // if its a login error... 
      if (Login()) 
       _proxy.Method2(); 
      else 
       throw; 
     } 
     return ""; 
    } 

    protected bool Login() 
    { 
     return true; // i.e. success 
    } 
} 
+0

Paul:是的,「每次重新輸入」都是我試圖避免的問題。我已經將Web服務本身抽象爲客戶端代碼的接口。我昨天最終走上了「ping」路線,似乎按預期工作。 – Pete 2010-03-30 23:02:22

+0

這很好,他們可能是相當令人沮喪的錯誤處理! – 2010-03-30 23:25:56

0

我會建議看AspectF圖書館,在那裏我曾試圖解決這樣的問題,重試。你可以這樣做:

AspectF.Define.Retry(() => client.TheRealMethod(),() => login.DoLoginAgain()); 

看看這個,它使編碼這樣的重試,錯誤處理,日誌記錄等清潔。

http://www.codeproject.com/KB/library/DotNetMQ.aspx

相關問題