Renci SSH .NET SFTP — создание файла, когда на SFTP-сервере нет свободного места, зависает навсегда

#c# #.net #sftp

Вопрос:

Я использую библиотеку SFTP Renci SSH .NET для загрузки / выгрузки файлов на SFTP-сервер.

Недавно у меня возникла неожиданная ситуация — загрузка файла зависла и оставалась в этом состоянии несколько часов — файл на сервере был создан, но размером 0 байт.

Позже администратор сервера признал, что у них не хватало свободного места на сервере, так что, похоже, это и было причиной.

Но мой вопрос в том, почему SFTP — клиент не выдал никакого исключения, ни тайм-аута, ничего?

Мой код для загрузки файла в SFTP выглядит следующим образом:

             try
            {
                using (var client = new SftpClient(account.Host, account.Username, new[] { privateKey }))
                using (var fileStream = File.OpenRead(localFilePath))
                {
                    client.Connect();

                    if (!client.Exists($"/{account.DirectoryPath}/{ftpDirectory}"))
                        client.CreateDirectory($"/{account.DirectoryPath}/{ftpDirectory}");

                    client.UploadFile(fileStream, ftpFilePath);
                    client.Disconnect();
                }
            }
            catch (Exception ex)
            {
                // exception handling
            }
 

Как предотвратить подобные случаи в будущем?

Renci SFTPClient по умолчанию имеет 30-секундный тайм-аут подключения, но в этом случае он не был запущен. Я думал о проверке свободного места перед загрузкой файла, но я вижу, что библиотека также не поддерживает такого рода функции.

Итак, каковы мои варианты? Заранее спасибо за помощь.

Комментарии:

1. Похоже, это должно быть сообщение об ошибке для разработчиков используемой вами библиотеки.

2. Или ошибка в сервере. Тестировали ли вы какой-либо клиент командной строки/графического интерфейса в том же сценарии?

3. @MartinPrikryl Я думаю, что это произошло потому, что я не установил для параметра OperationTimeout определенное значение — оно отображается как бесконечность по умолчанию. Я думаю, что в этом и была причина.

Ответ №1:

Похоже, причина проблемы заключалась в том, что OperationTimeout параметр in SftpClient не был установлен — по умолчанию он равен бесконечности.

Комментарии:

1. Я так не думаю.

2. Ну, я знаю, что мне помогло, но если ты знаешь это лучше….