据我了解,该FtpWebRequest.Proxy
属性表示 HTTP 代理。我必须通过 FTP 代理向外部服务器发出 FTP 请求。
到目前为止,我让它工作的唯一方法是创建一个使用 Windows FTP 命令的脚本并以这种方式下载。
是否可以使用FtpWebRequest
FTP 代理下载文件?
据我了解,该FtpWebRequest.Proxy
属性表示 HTTP 代理。我必须通过 FTP 代理向外部服务器发出 FTP 请求。
到目前为止,我让它工作的唯一方法是创建一个使用 Windows FTP 命令的脚本并以这种方式下载。
是否可以使用FtpWebRequest
FTP 代理下载文件?
这是我以前使用过的代码,我应该注意我只针对检查点防火墙进行了测试,因此格式 USER 和 PASS 命令可能与您的 FTP 代理不同。您的系统管理员会知道正确的格式。
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");
USER
如果 FTP 代理允许通过和命令指定有关目标的所有信息PASS
,则可以使用Credentials
属性.
通常,您在表单中指定用户名并在表单中指定user@proxyuser@host
密码password@proxypassword
:
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://proxy/path");
request.Credentials = new NetworkCredential("user@proxyuser@host", "password@proxypassword");
如果代理不需要身份验证,请使用表单user@host
和password
:
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://proxy/path");
request.Credentials = new NetworkCredential("user@host", "password");
但是您的代理服务器可能还需要不同的语法,例如:
USER
代理用户和目标主机用户的单独命令OPEN
命令SITE
命令在这些情况下,您不能使用FtpWebRequest
. 您必须改用第 3 方 FTP 客户端库。
例如,使用WinSCP .NET 程序集,您可以使用:
// 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
,请参阅原始设置。
更简单的是在 WinSCP GUI 中配置代理设置并让它为您生成 C# FTP 代码模板。
请注意,WinSCP .NET 程序集不是本机 .NET 库。它是控制台应用程序上的一个瘦 .NET 包装器。
(我是WinSCP的作者)
如果你有预算的话——Dart 会为此做一些很棒的课程:
http://www.dart.com/ 或具体 为 http://www.dart.com/ptftpnet.aspx
我知道这已经过了截止日期,但是是的,我可以通过使用将 URL 设置为的旧技巧让 FtpWebRequest 与 ftp 代理一起工作
"ftp://your.proxy.server/theFileToDownload")"
然后将您的网络凭据设置为
username="ftpUserName@ftp.realserver.com"
和
password="password".
我记得在糟糕的旧 WININET 时代这样做过,有时旧技巧仍然是最好的技巧。
当然是 YMMV。
他们声称可以通过代理列出、列出详细信息和下载。但是我无法让它与 isa 防火墙一起使用。所以我在我的 app.config 中禁用了默认代理,并为 ForeFront/ISA 客户端添加了一个应用程序规则。为此,我创建了一个文件 c:\programdata\microsoft\firewall client 2004\application.ini,其内容为:
[应用程序名称] DisableEx=0 禁用=0 NameResolution=R
其中 applicationName 是正在运行的 exe 减去 .exe 扩展名。