是否可以通过FTP代理使用C#FtpWebRequest?

时间:2010-09-02 10:14:48

标签: c# .net proxy ftp ftpwebrequest

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

到目前为止,我唯一可行的方法是创建一个使用Windows FTP命令并以此方式下载的脚本。

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

5 个答案:

答案 0 :(得分:3)

这是我之前使用过的代码,我应该警告我只针对Checkpoint防火墙进行了测试,因此对于您的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");

答案 1 :(得分:1)

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

http://www.dart.com/ 或具体而言 http://www.dart.com/ptftpnet.aspx

答案 2 :(得分:1)

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

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

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

username="ftpUserName@ftp.realserver.com" 

password="password". 

我记得在糟糕的旧WININET日子里做这件事,有时老技巧仍然是最好的技巧。

YMMV当然。

答案 3 :(得分:1)

如果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。您必须使用第三方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的作者)

答案 4 :(得分:-1)

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

[的applicationName] DisableEx = 0 禁用= 0 NameResolution = R

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