You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 17:17:48