[英]What is a decent method for re-trying after failed connection of GET, and POST HTTP Methods via RestSharp?
此 C# 控制台應用程序使用 REST 和 RestSharp 連接到服務器,這台托管的電腦沒有穩定的 inte.net 連接,因此有時連接 go 斷開並想要實現重試循環 x 次。
他們是從另一個 class Example Program.cs 調用的
Login()
{
// Restsharp code
// Restsharp receives response
// based on RestSharp documentation StatusCode 0 means a failed connection usually on this internet is down or server is down.
if(response.StatusCode == 0)
{
Logger.Error("Failed Connection")
return null;
}
}
Items GetItemsInventory()
{
// Restsharp code
// Restsharp receives response
// based on RestSharp documentation StatusCode 0 means a failed connection usually on this internet is down or server is down.
if(response.StatusCode == 0)
{
Logger.Error("Failed Connection")
return null;
}
if(response.StatusCode == HttpStatusCode.BadRequest)
{
Logger.Error("Data is incorrect")
return null;
}
if(response.StatusCode == HttpStatusCode.Created)
{
Logger.Info("Received Data Successfully")
return Items;
}
}
void PostItemsInventory()
{
// Restsharp code
// Restsharp receives response
// based on RestSharp documentation StatusCode 0 means a failed connection usually because internet is down, firewall issue or server is down.
if(response.StatusCode == 0)
{
Logger.Error("Failed Connection")
}
if(response.StatusCode == HttpStatusCode.BadRequest)
{
Logger.Error("Data is incorrect")
}
if(response.StatusCode == HttpStatusCode.Created)
{
Logger.Info("Data Sent Successfully")
// does other stuff
}
}
Program.cs 調用此方法
static void Main(string[] args)
{
//gets login details
Login();
GetItemsInventory(Items);
//does stuff
PostItemsInventory(ItemsSold);
}
只有當 RestSharp 返回 StatusCode 0 時,哪里才是實現“x”次重試的好地方或方法。我在考慮每個方法中的 for 循環,或者還有另一種沒有循環的方法。
首先我要強調的是,不能對所有的事情都盲目地進行重試。 有一些操作,就其性質而言,在沒有副作用的情況下是不可重復的。 因此,我建議檢查給定操作是否滿足這些要求:
您還應該知道,如果您沒有收到回復,並不意味着下游系統沒有收到您的請求。 請求-響應 model 的任何時間都可能中斷連接。因此,可能會發生請求被接收、處理甚至響應由服務發出但請求者沒有收到任何響應的情況。
如果操作是冪等的,因為存在重復數據刪除邏輯,或者操作本質上是無副作用的,那么您可以嘗試重新發出請求以克服 transient.network 故障。
Polly是一個 do.NET 彈性庫,它允許您定義諸如重試之類的策略,然后用它們裝飾任何任意方法。 在您的特定示例中,您可以定義一個重試策略,該策略在收到的狀態代碼為 0 時觸發,並且最多重試x
次。
var retryPolicy = Policy
.HandleResult<IRestResponse>(r => r.StatusCode == 0)
.WaitAndRetry(x, _ => TimeSpan.FromSeconds(1));
然后你可以像這樣裝飾你的RestClient
的Execute
方法
var response = retryPolicy.Execute(() => restClient.Execute(restRequest));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.