我已经构建了一个控制台应用程序来将文件上传到FTP服务器。因为这个FTP服务器只接受SFTP协议,所以我使用SSH.NET开源库,因为.NET中没有内置方法(对于.NET 3.5,我在Visual Studio 2008 Professional下使用的那个)。< / p>
我见过很多例子。我已经实现了一个快速测试应用程序来连接到公共SFTP服务器并使用SFTP协议上传文件。
我正在使用从here获得的公共免费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
此外,我尝试按照here解释更改超时但未成功。
但是,如果我尝试使用FileZilla客户端使用相同的凭据连接到同一SFTP服务器,那么我可以毫无问题地连接,甚至上传文件。
所以我不明白发生了什么。有人能帮助我吗?
更新: 我找到了fix。该补丁在2017年1月22日应用于develop Brank,但下载的最后一个二进制文件是2016年12月14日。那么我如何获得包含此修复程序的二进制文件?
答案 0 :(得分:1)
我已经解决了。
我从开发人员分支下载了源代码,其中纠正了此错误。然后我在Visual Studio 2015中打开.NET Framework 3.5项目并构建它。所以我获得了二进制文件,DLL用于发布和调试。然后我回到我的Visual Studio 2008项目,并添加此引用。我现在用相同的代码检查了一下,我可以使用相同的凭据连接到FTP服务器。
SSH.NET web中提供的最后一个二进制文件不包含此错误。
答案 1 :(得分:-4)
我使用Tamir.SharpSSH在我们的SFTP中发送文件。尝试使用这个,下面的代码是将文件发送到sftp的最简单方法。
Sftp sftpBase = new Tamir.SharpSsh.Sftp(_sftpHost, _sftpUid, Up_decryptPass);
sftpBase.Connect(int.Parse(_sftpPort));
sftpBase.Put(Dir + filename, sftpDir);