这个c#控制台应用程序使用REST与RestSharp连接到服务器,这个pc主机没有稳定的互联网连接,所以有时连接断开,想要实现x次重试的循环。
它们是从另一个类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循环,或者有另一种不使用循环的方法。
重试
首先我要强调的是重试应该而不是盲目地追求一切。有一些操作,就其本质而言,是不可重复的而没有副作用。因此,我建议检查给定操作是否满足这些要求:
- 潜在引入的可观察影响是可接受的
- 手术可重做,无不可逆副作用
- 与承诺的可靠性相比,引入的复杂性可以忽略不计
您还应该意识到,如果您没有收到响应,并不意味着下游系统没有收到您的请求。连接可以在请求-响应模型的任何时间中断。因此,可能会发生这样的情况:请求被接收、处理,甚至服务发送了响应,但请求者没有收到任何响应。
如果操作是幂等的,因为有一个重复数据删除逻辑,或者操作本质上是无副作用的,那么你可以尝试重新发出请求来克服暂时的网络故障。
波莉的重试Polly是一个dotNET弹性库,它允许你定义策略,比如重试,然后用它们装饰任何任意方法。在您的特定示例中,您可以定义一个重试策略,该策略在接收到的状态码为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));