我遇到了一个问题,我收到间歇性错误消息
“远程主机强制关闭了现有连接”
尝试连接sftp服务器时。我正在尝试连接azure函数应用程序内部的sftp。我相信此错误发生时存在连接问题。
为了处理这个问题,我需要实现一个重试逻辑,以防这样的错误重复发生,以指定的延迟连接sftp服务器,直到达到配置的最大重试计数。我相信函数应用程序允许的最大执行时间是5分钟(* 需要从azureMaven那里听到它 *)。
有人能帮助我如何在C#中实现这个重试功能吗?
我正在使用Renci.SshNet
nuget包来管理sftp
using (var _sftpCn = new SftpClient(host, port, userName, password))
{
_sftpCn.Connect();//error happens on this line:"An existing connection was forcibly closed by the remote host"
log.LogInformation("Successful");
byte[] byteArray = Encoding.UTF8.GetBytes(datacontent);
sftpCl.WriteAllBytes("{remotePath}", byteArray);
log.LogInformation("Sent successfully");
_sftpCn.Disconnect();
}
2条答案
按热度按时间xtupzzrd1#
我建议在这里使用Polly。
Polly是一个. NET弹性和瞬时故障处理库,它允许开发人员以流畅和线程安全的方式表达诸如重试、断路器、超时、隔板隔离和回退等策略。
它是免费的库,可以通过以下命令下载为nuget package:
dotnet add package Polly
它还有很多功能,请参见here和here以了解更多细节和示例。
9rbhqvlz2#
如果你看一下
Connect
方法的源代码,你会发现它有关于异常的文档注解,不幸的是,它们都没有提到你所面临的错误消息。正如您在注解中所说的,您不知道抛出了哪个异常,因为您的日志记录系统只捕获异常的消息,您的怀疑对象是
SSHException
和SShConnectionException
。在Polly的情况下,您可以针对这种情况以多种方式定义重试策略
1.使用单个
Handle
生成器方法1.使用
Handle
和Or
生成器方法1.如果引发的异常不是任何可疑异常
那么您可以用一种类型安全性较低的方式定义策略
你也提到
函数app允许的最大执行时间为5分钟
Polly的重试允许您定义最多要执行相同操作的次数:
Retry
或WaitAndRetry
生成器方法来实现RetryForever
或WaitAndRetryForever
生成器方法来实现如果要在给定的时间范围内执行重试尝试,则需要将“重试”和“超时”策略结合使用。
请记住,
Wrap
方法参数的顺序很重要:这种灵活性允许您定义每次重试尝试以及总时间约束
我希望这些例子能帮助你解决你的问题。