【问题标题】:ssh.net throw operation session has timed out and get stuckssh.net throw 操作会话已超时并卡住
【发布时间】:2020-06-22 20:01:25
【问题描述】:

我创建了使用 SSH.net 每 600 秒从 sFTP 服务器读取文件的窗口服务 在 OnStart 我创建计时器

timer = new Timer(TimerCallback, null, 0, timeDelay);

TimerCallBack 是使用 SSH.net 的函数。在读取文件之前的连接中,我有代码连接到 sFTP 服务器,如下所示

            var FILE_READ_FLAG = false;
            try
            {
                req = new SftpClient(ftpHost, ftpLogin, ftpLoginPassword);
                req.Connect();
                if (req.IsConnected)
                {
                    directories = req.ListDirectory(ftpPath);
                    FILE_READ_FLAG = true;
                }
            }
            catch (Exception e)
            {

                EventLog.WriteEntry(sSource,"ERROR : " + GetFullMessageFromException(e), 
                                    EventLogEntryType.Information, 234);
                
                FILE_READ_FLAG = false;
            }
            if (FILE_READ_FLAG){
               // read file and insert to database
            }

问题是当服务运行并发生异常时,服务可以每 600 秒再次运行一次,但出现错误

Session operation has timed out
   at Renci.SshNet.Session.WaitOnHandle(WaitHandle waitHandle, TimeSpan timeout)
   at Renci.SshNet.Session.WaitOnHandle(WaitHandle waitHandle)
   at Renci.SshNet.Session.Connect()
   at Renci.SshNet.BaseClient.Connect()

当我尝试停止和重新启动服务时,服务无法再次运行并且似乎卡住了,Windows 显示警报消息无法及时停止,我必须通过 cmd 终止服务并手动启动它

我的问题是为什么另一个异常可以用 try/catch 块处理,但是由于这个错误,服务不能用计时器再次运行,我错过了什么或使用错误?谢谢

【问题讨论】:

    标签: c# .net ssh.net


    【解决方案1】:

    您已经创建了一个对象 SftpClient。查看代码,它没有得到正确处理,也没有调用断开连接。有可能,如果出现错误,系统将挂起,因为有一个打开的连接。

    但是,您将客户端设置为变量(即req = new SftpClient(ftpHost, ftpLogin, ftpLoginPassword),因此它可能会在其他地方调用断开/处置。尽管我仍然建议重新构建代码,以便您从 SFTP 客户端获取数据,然后它们会立即断开/处理。最好尽量减少连接打开的时间。

    考虑以下几点:

    List<SftpFile> files = null; 
    using (SftpClient sftp = new SftpClient(host, username, password)) // using will dispose SftpClient
    {
        try
        {
            sftp.Connect();    
            files = sftp.ListDirectory(ftpPath).ToList();    
            sftp.Disconnect();
        }
        catch (Exception e)
        {
            EventLog.WriteEntry(sSource,"ERROR : " + GetFullMessageFromException(e), 
                                    EventLogEntryType.Information, 234);
        }
    }
    
    if(files.any())
    {
       // Process the files.
    }
    

    【讨论】:

    • 在我编辑完代码后,服务可以继续运行,但问题也不会再次出现,现在我仍在跟踪问题一段时间以确保问题消失。
    猜你喜欢
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    相关资源
    最近更新 更多