我正在使用C#的Web服務,並且Web服務需要登錄呼叫,然後使用Cookie會話。 Web服務將在一段時間後超時,之後客戶端將不得不重新登錄。我想找到一種方法來自動捕獲服務在此場景中發送的soap故障,並通過重新登錄然後重試以前嘗試的呼叫來處理它。如果認證失敗需要重新登錄,請重試Web服務呼叫
我寧願自動爲所有有問題的Web服務方法自動執行此操作,而不必使用重試邏輯手動包裝調用。
對此提出建議?
我正在使用C#的Web服務,並且Web服務需要登錄呼叫,然後使用Cookie會話。 Web服務將在一段時間後超時,之後客戶端將不得不重新登錄。我想找到一種方法來自動捕獲服務在此場景中發送的soap故障,並通過重新登錄然後重試以前嘗試的呼叫來處理它。如果認證失敗需要重新登錄,請重試Web服務呼叫
我寧願自動爲所有有問題的Web服務方法自動執行此操作,而不必使用重試邏輯手動包裝調用。
對此提出建議?
爲了避免類似的問題,我實際上偶爾會「碰到」服務(我在另一端控制了服務,並創建了一種非常輕便的「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
}
}
Paul:是的,「每次重新輸入」都是我試圖避免的問題。我已經將Web服務本身抽象爲客戶端代碼的接口。我昨天最終走上了「ping」路線,似乎按預期工作。 – Pete 2010-03-30 23:02:22
這很好,他們可能是相當令人沮喪的錯誤處理! – 2010-03-30 23:25:56
我會建議看AspectF圖書館,在那裏我曾試圖解決這樣的問題,重試。你可以這樣做:
AspectF.Define.Retry(() => client.TheRealMethod(),() => login.DoLoginAgain());
看看這個,它使編碼這樣的重試,錯誤處理,日誌記錄等清潔。
什麼樣的Web服務客戶端? 「添加Web引用」(ASMX)或「添加服務引用」(WCF)?這對於WCF客戶端來說會更容易。 – 2010-03-26 01:58:52
這是一個常規的Web引用。我們很遺憾地堅持使用.NET 2.0(現在) – Pete 2010-03-29 16:45:17