Загрузка файла в SFTP с использованием SSH.NET: не удается подключиться
Я создал консольное приложение для загрузки файла на FTP-сервер. Поскольку этот FTP-сервер принимает только протокол SFTP, я использую библиотеку с открытым исходным кодом SSH.NET, поскольку в.NET нет встроенного метода (по меньшей мере, для.NET 3.5, который я использую в Visual Studio 2008 Professional).
Я видел много примеров. Я реализовал приложение быстрого тестирования для подключения к общедоступному серверу SFTP и загрузки файла по протоколу SFTP.
Я использую ниже публичный бесплатный SFTP-сервер, полученный здесь:
server : demo.wftpserver.com
user : demo-user
password : demo-user
port : 2222
И вот код:
const string host = "demo.wftpserver.com";
const string username = "demo-user";
const string password = "demo-user";
const string workingdirectory = "/upload";
const string uploadfile = @"C:\test.txt";
const int port = 2222;
static void Main(string[] args)
{
try
{
using (SftpClient client = new SftpClient(host, port, username, password))
{
{
client.Connect();
Console.WriteLine("Connected to {0}", host);
client.ChangeDirectory(workingdirectory);
Console.WriteLine("Changed directory to {0}", workingdirectory);
var listDirectory = client.ListDirectory(workingdirectory, null);
Console.WriteLine("Listing directory:");
foreach (var fi in listDirectory)
{
Console.WriteLine(" - " + fi.Name);
}
using (var fileStream = new FileStream(uploadfile, FileMode.Open))
{
Console.WriteLine("Uploading {0} ({1:N0} bytes)", uploadfile, fileStream.Length);
client.BufferSize = 4 * 1024; // bypass Payload error large files
client.UploadFile(fileStream, Path.GetFileName(uploadfile), null);
}
}
}
}
catch (Exception e)
{
Console.Out.WriteLine(e.Message);
}
Проблема заключается в следующем:
При попытке соединения с сервером используйте предложение ниже:
client.Connect();
Я получаю исключение. Исключение говорит следующее:
"Value cannot be null. \r\nParameter name: All lists are either null or empty."
StackTrace " at Renci.SshNet.Session.WaitOnHandle(WaitHandle waitHandle, TimeSpan timeout)\r\n at Renci.SshNet.Session.WaitOnHandle(WaitHandle waitHandle)\r\n at Renci.SshNet.Session.Connect()\r\n at Renci.SshNet.BaseClient.Connect()\r\n at ConsoleApplication2.Program.Main(String[] args) at C:\\Users\\Win7\\Downloads\\ConsoleApplication2\\ConsoleApplication2\\Program.cs:line 61" string
Кроме того, я попытался изменить время ожидания, как описано здесь, но безуспешно.
Однако, если я попытаюсь подключиться к тому же серверу SFTP, используя те же учетные данные от клиента FileZilla, то я могу подключиться без проблем и даже загрузить файл.
Поэтому я не понимаю, что происходит. Может ли кто-нибудь помочь мне?
ОБНОВЛЕНИЕ: я нашел это исправление. Патч был применен в разработке Brank 22 января 2017 года, но последний бинарный файл для загрузки - 14 декабря 2016 года. Так как же получить бинарные файлы, включающие это исправление?
2 ответа
Я решил.
Я скачал исходный код из ветки разработчика, в которой эта ошибка исправлена. Затем я открываю проект.NET Framework 3.5 в Visual Studio 2015 и собираю его. Так я получил двоичные файлы, DLL для выпуска и отладки. Затем я возвращаюсь к своему проекту Visual Studio 2008 и добавляю эту ссылку. И я проверил, что с тем же кодом теперь я могу подключиться к FTP-серверу с теми же учетными данными.
Последний двоичный файл, предоставленный в сети SSH.NET, не включает эту исправленную ошибку.
Я использовал Tamir.SharpSSH для отправки файла в наш SFTP. Попробуйте использовать этот код ниже, это самый простой способ отправить файл на ваш sftp.
Sftp sftpBase = new Tamir.SharpSsh.Sftp(_sftpHost, _sftpUid, Up_decryptPass);
sftpBase.Connect(int.Parse(_sftpPort));
sftpBase.Put(Dir + filename, sftpDir);