我一直在通过一个不可靠和/或速度慢的VPN上使用远程Web服务,当我调用Web服务时,我的代码中会出现故障点,我将获得超时异常。我做了一点谷歌搜索,发现了Polly,似乎正是我所需要的,但我仍然得到一个未处理的TimeoutException,并想知道我做错了什么,以及如何更新代码,以便处理TimeoutException,最好使用Polly。
var networkPolicy = Policy
.Handle<TimeoutException>()
.Or<CommunicationException>()
.WaitAndRetry(
5,
retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
(exception, timeSpan, context) =>
{
System.Diagnostics.Debug.WriteLine("Exception being retried" + exception );
});
// The following line is giving me the exception.
response = networkPolicy.Execute(() => soapClient.WebServiceFunction(request));
我还想知道将策略定义为静态只读变量是否是最佳做法?
答案 0 :(得分:1)
Polly工作,以便在发生错误时重复操作,但只有一定次数。如果错误发生的次数多多,Polly会抛出它。
如果你想重复它,直到它没有被抛出,那么使用RetryForever。
通常我会使用Polly尝试捕捉 - 就像这里:
try
{
return
await
Policy.Handle<MongoConnectionException>()
.RetryAsync(3,
(exception, i) =>
{
logger.Warn(exception,
string.Format("Mongo Connection Exception - Retry Count : {0}", i));
})
.ExecuteAsync(async () => await operation());
}
catch (MongoConnectionException ex)
{
logger.Error(ex);
return null;
}