#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. Ну, я знаю, что мне помогло, но если ты знаешь это лучше….