我正在使用 Renci.SshNet.Sftp 连接到 SFTP。当我尝试调用 sftpClientObject.Connect()
时,出现以下错误。请找到下面的错误。前几天还工作得很好。检查了认证详情,完美。
var _sftpClient = new SftpClient(_hostName, _userName, _password);
using (_sftpClient)
{
_sftpClient.Connect();
// Other code to follow
}
Error:
Value cannot be null.
Parameter name: At least one element in the specified array was null.
异常堆栈跟踪:
at System.Threading.WaitHandle.WaitAny(WaitHandle[] waitHandles, Int32 millisecondsTimeout, Boolean exitContext)
at System.Threading.WaitHandle.WaitAny(WaitHandle[] waitHandles, TimeSpan timeout, Boolean exitContext)
at System.Threading.WaitHandle.WaitAny(WaitHandle[] waitHandles, TimeSpan timeout)
at Renci.SshNet.Session.WaitHandle(WaitHandle waitHandle)
at Renci.SshNet.PasswordAuthenticationMethod.Authenticate(Session session)
at Renci.SshNet.ConnectionInfo.Authenticate(Session session)
at Renci.SshNet.Session.Connect()
at Renci.SshNet.BaseClient.Connect()
at SftpPoller.FileTransferClient.ProcessFilesInSftp(TextWriter log) in
但是当我使用以下代码时,它起作用了:
var methods = new AuthenticationMethod[1];
methods[0] = new PasswordAuthenticationMethod(_userName, _password);
var con = new ConnectionInfo(_hostName, _userName, methods) {Timeout = new TimeSpan(0, 0, 0, 60)};
_sftpClient = new SftpClient(con);
谁能帮我解决这个问题吗?
谢谢
最佳答案
似乎唯一可以想象的情况是,当PasswordAuthenticationMethod.Authenticate
可以将未初始化的等待句柄传递给WaitHandle.WaitAny
时, session 关闭而身份验证正在执行。正在进行中。
如果 session 由于超时而关闭,设置更高的超时可以解决问题,正如您自己所发现的那样。
设置超时的更简单的代码是:
var _sftpClient = new SftpClient(_hostName, _userName, _password);
_sftpClient.ConnectionInfo.Timeout = TimeSpan.FromSeconds(60);
您似乎使用的是旧版本的 SSH.NET(可能是 NuGet 中提供的版本 2013.4.7)。由于后续版本对相关部分代码进行了重构,升级也可能会解决这个问题。无论如何,您都应该这样做,因为 NuGet SSH.NET 包确实很旧。
关于C# Renci.SshNet.Sftp Connect 抛出 ArgumentNullException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33216301/