Повторите попытку SFTP, если это не удается? - PullRequest
0 голосов
/ 19 октября 2019

Я использую SSH.Net для загрузки, но хочу повторить попытку SFTP-файла в случае сбоя процесса. У меня есть этот код, но я не думаю, что это лучший способ выполнить повторную попытку. Как лучше всего справиться с этим?

        var exceptions = new List<Exception>();
        int retryCount = 3;

        for (int retry = 0; retry < retryCount; retry++)
        {
            try
            {
                var filePath = Path.Combine(path, fileName);

                var client = new SftpClient("ftp.site.com", 22, "userName", "password");

                client.Connect();

                if (client.IsConnected)
                {
                    var fileStream = new FileStream(filePath, FileMode.Open);
                    if (fileStream != null)
                    {
                        client.UploadFile(fileStream, "/fileshare/" + fileName, null);

                        client.Disconnect();
                        client.Dispose();
                    }

                }
            }
            catch (Exception ex)
            {
                exceptions.Add(ex);
                System.Threading.Thread.Sleep(10000);
            }

            if (exceptions.Count == 3)
            {
                throw exceptions[0];
            }
        }

1 Ответ

1 голос
/ 19 октября 2019

Рекомендуемый подход для повторных попыток - библиотека обработки временных ошибок Polly .

var retryPolicy = Policy
  .Handle<Exception>()
  .WaitAndRetry(3, retryAttempt => 
    TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)) 
  );

retryPolicy.Execute(() => {
    using (var client = new SftpClient("ftp.site.com", 22, "userName", "password")) 
    {
        /* file uploading .. */
    }
});
...