【问题标题】:Is it possible to use C# FtpWebRequest through a FTP proxy?是否可以通过 FTP 代理使用 C# FtpWebRequest?
【发布时间】:2010-09-02 10:14:47
【问题描述】:

据我了解,FtpWebRequest.Proxy 属性表示 HTTP 代理。我必须通过 FTP 代理向外部服务器发出 FTP 请求。

到目前为止,我让它工作的唯一方法是创建一个使用 Windows FTP 命令的脚本并以这种方式下载。

是否可以使用FtpWebRequest 通过 FTP 代理下载文件?

【问题讨论】:

    标签: c# .net proxy ftp ftpwebrequest


    【解决方案1】:

    这是我以前使用过的代码,我需要注意的是,我只针对检查点防火墙进行了测试,因此对于您的 FTP 代理,USER 和 PASS 命令的格式可能会有所不同。您的系统管理员会知道正确的格式。

    FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(
           new Uri("ftp://FTP PROXY HOST/actual/path/to/file/on/remote/ftp/server"));
    reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
    reqFTP.UseBinary = true;
    
    reqFTP.Credentials = new NetworkCredential
           ("REMOTE FTP USER@FTP PROXY USER@REMOTE FTP HOST"
           , "REMOTE FTP PASSWORD@FTP PROXY PASSWORD");
    

    【讨论】:

      【解决方案2】:

      如果 FTP 代理允许通过USERPASS 命令指定有关目标的所有信息,则可以使用Credentials property

      通常,您以user@proxyuser@host 的形式指定用户名,以password@proxypassword 的形式指定密码:

      FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://proxy/path");
      request.Credentials = new NetworkCredential("user@proxyuser@host", "password@proxypassword");
      

      如果代理不需要身份验证,请使用表单user@hostpassword

      FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://proxy/path");
      request.Credentials = new NetworkCredential("user@host", "password");
      

      但您的代理服务器也可能需要不同的语法,例如:

      • 单独的USER 命令用于代理用户和目标主机用户
      • OPEN 命令
      • SITE 命令

      在这些情况下,您不能使用FtpWebRequest。您必须改用第 3 方 FTP 客户端库。

      例如WinSCP .NET assembly,你可以使用:

      // Setup session options
      SessionOptions sessionOptions = new SessionOptions
      {
          Protocol = Protocol.Ftp,
          HostName = "host",
          UserName = "user",
          Password = "password",
      };
      
      // Configure proxy
      sessionOptions.AddRawSettings("ProxyHost", "proxy");
      sessionOptions.AddRawSettings("FtpProxyLogonType", "2");
      sessionOptions.AddRawSettings("ProxyUsername", "proxyuser");
      sessionOptions.AddRawSettings("ProxyPassword", "proxypassword");
      
      using (Session session = new Session())
      {
          // Connect
          session.Open(sessionOptions);
      
          // Your code
      }
      

      有关SessionOptions.AddRawSettings 的选项,请参阅raw settings

      更容易的是configure the proxy settings in WinSCP GUI 并为您提供generate C# FTP code template

      请注意,WinSCP .NET 程序集不是本机 .NET 库。它是控制台应用程序上的一个精简的 .NET 包装器。

      (我是 WinSCP 的作者)

      【讨论】:

        【解决方案3】:

        如果你有预算 - Dart 可以为此做一些很棒的课程:

        http://www.dart.com/ 或者具体来说 http://www.dart.com/ptftpnet.aspx

        【讨论】:

        • 我不确定我是否能够摇摆它,但它看起来确实是一个不错的解决方案。阅读他们的网站还表明,根本不可能使用 .NET CLR 中提供的 FTP 代理。
        【解决方案4】:

        我知道这已经过了截止日期,但是是的,我可以通过使用将 URL 设置为的旧技巧让 FtpWebRequest 与 ftp 代理一起工作

        "ftp://your.proxy.server/theFileToDownload")" 
        

        然后将您的网络凭据设置为

        username="ftpUserName@ftp.realserver.com" 
        

        password="password". 
        

        我记得在糟糕的旧 WININET 时代这样做过,有时旧技巧仍然是最好的技巧。

        当然是 YMMV。

        【讨论】:

          【解决方案5】:

          他们声称可以通过代理列出、列出详细信息和下载。但是我无法让它与 isa 防火墙一起使用。所以我在我的 app.config 中禁用了默认代理,并为 ForeFront/ISA 客户端添加了一个应用程序规则。为此,我创建了一个文件 c:\programdata\microsoft\firewall client 2004\application.ini,内容如下:

          [应用程序名称] DisableEx=0 禁用=0 NameResolution=R

          其中 applicationName 是正在运行的 exe 减去 .exe 扩展名。

          【讨论】:

          • 我相信这是指 HTTP 代理而不是 FTP 代理。
          最近更新 更多