C#Renci.SshNet.Sftp连接抛出ArgumentNullException

时间:2015-10-19 13:53:42

标签: c# ssh ssh.net

我正在使用Renci.SshNet.Sftp连接到SFTP。我尝试拨打sftpClientObject.Connect()时收到以下错误消息。请在下面找到错误。几天前它工作得很好。检查身份验证详细信息,这是完美的。

var _sftpClient = new SftpClient(_hostName, _userName, _password);
using (_sftpClient)
{
    _sftpClient.Connect();
    // Other code to follow
}
  

错误:
  值不能为空。
  参数名称:指定数组中至少有一个元素为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);

任何人都可以帮我解决这个问题吗?

由于

1 个答案:

答案 0 :(得分:3)

PasswordAuthenticationMethod.Authenticate可以将未初始化的等待句柄传递给WaitHandle.WaitAny时,似乎唯一可以想象的场景是在身份验证正在进行时关闭会话。

如果会话因超时而关闭,设置更高的超时可以解决问题,就像您自己找到的一样。

设置超时的简单代码是:

var _sftpClient = new SftpClient(_hostName, _userName, _password);
_sftpClient.ConnectionInfo.Timeout = TimeSpan.FromSeconds(60);

您似乎使用旧版本的SSH.NET(可能是NuGet中提供的版本2013.4.7)。由于代码的相关部分在以后的版本中进行了重构,因此升级也可以解决此问题。你应该这样做,因为NuGet SSH.NET软件包真的很旧。