如何在C#循环中用WinSCP .NET组件实时检测SFTP连接状态?
SFTP连接状态实时检测与重连实现
现有代码的问题
- 第一个while循环:
session.Opened仅表示初始连接是否成功,连接断开后不会自动更新为false,因此会持续显示在线状态,无法感知连接中断。 - 第二个for循环:每次循环都新建Session、连接后立即关闭,无法维持长连接并实时监控状态变化,不符合需求。
解决思路
- 主动校验连接有效性:不依赖
Session.Opened属性,通过执行轻量SFTP操作(如获取当前工作目录、列出根目录)验证连接是否存活。 - 重连逻辑:校验失败(抛出异常)时标记为离线,间隔一段时间后尝试重新连接,直到恢复。
- 控制循环频率:添加延迟避免CPU占用过高。
- 精准异常处理:区分连接类异常与其他错误,确保状态判断准确。
改进后的代码实现
using WinSCP; using System; class SftpStatusMonitor { static void Main() { // 会话配置 SessionOptions sessionOptions = new SessionOptions { Protocol = Protocol.Sftp, HostName = "xxx.xx.xx.xx", UserName = "xxxxxx", Password = "xxxxxxxxx", SshHostKeyFingerprint = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx", }; int counter = 0; Session session = null; bool isOnline = false; while (true) { try { if (session == null || !session.Opened) { // 初始化或重新连接会话 session?.Dispose(); session = new Session(); session.Open(sessionOptions); isOnline = true; Console.WriteLine($"{counter++} {DateTime.Now} Online - 连接成功"); } else { // 执行轻量操作校验连接存活状态 session.GetWorkingDirectory(); if (!isOnline) { isOnline = true; Console.WriteLine($"{counter++} {DateTime.Now} Online - 连接恢复"); } else { Console.WriteLine($"{counter++} {DateTime.Now} Online"); } } } catch (SessionRemoteException ex) { // 连接相关异常,标记离线 isOnline = false; Console.WriteLine($"{counter++} {DateTime.Now} Offline - {ex.Message}"); // 释放会话资源,准备重连 session?.Close(); session?.Dispose(); session = null; } catch (Exception ex) { // 其他异常处理 Console.WriteLine($"{counter++} {DateTime.Now} Error - {ex.Message}"); session?.Close(); session?.Dispose(); session = null; isOnline = false; } // 控制检测频率,可根据需求调整 System.Threading.Thread.Sleep(10000); } } }
代码说明
- 连接校验:用
GetWorkingDirectory()做轻量验证,避免产生多余流量。 - 状态跟踪:
isOnline变量避免重复输出相同状态,可选调整。 - 资源管理:异常时确保Session被正确释放,防止资源泄漏。
- 延迟控制:每次循环休眠10秒,平衡实时性与资源占用。
内容的提问来源于stack exchange,提问作者phibac
相关产品推荐
相关产品推荐

