簡體   English   中英

ssh.net throw 操作 session 已經超時卡死

[英]ssh.net throw operation session has timed out and get stuck

我創建了 window 服務,該服務使用 SSH.net 在 OnStart 中每 600 秒從 sFTP 服務器讀取文件我創建了計時器

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

TimerCallBack 是使用 SSH.net 的 function。 在讀取文件之前的連接中,我有連接到 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 塊處理,但是由於這個錯誤,服務不能用計時器再次運行,我錯過了什么或使用錯誤? 謝謝你

您已經創建了一個 object 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.
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM