[英]"Socket read operation has timed out" exception with SSH.NET when connecting to FTP port 21
[英]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.