使用 CONNECT 方法通过 HTTP 代理建立 FtpWebRequest

本文关键字:代理 建立 FtpWebRequest HTTP CONNECT 方法 使用 | 更新日期: 2023-09-27 18:34:03

我尝试使用FtpWebRequest建立FTP连接。我需要通过 squid 代理服务器建立连接,这需要我先发送 CONNECT 命令。

我已经尝试了下面的代码,但这会导致对代理服务器的GET请求,它拒绝了。

FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" +server);
request.Credentials = new NetworkCredential(user, pwd);
var webproxy = new WebProxy(new Uri("http://" + proxy+ ":" + proxyPort));
webproxy.UseDefaultCredentials = true;
request.Proxy = webproxy;
request.UsePassive = true;
request.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();

有什么方法可以使用FtpWebRequest通过代理建立连接吗?

如果没有,您知道我可以使用的好的,希望免费的.NET FTP客户端吗?非常感谢您的帮助。

使用 CONNECT 方法通过 HTTP 代理建立 FtpWebRequest

FtpWebRequest 是一个"无会话"客户端,因此它不允许您在连接时与远程端进行交互。 我检查了FtpWebRequest的代码.cs但我看不出如何让它发送"CONNECT"命令。

"CONNECT"命令似乎不是标准FTP命令集的一部分,所以我无法理解它如何适应FTP库应该做的事情。

我使用的一个面向会话的良好免费FTP客户端是 http://sshnet.codeplex.com/的"SSH.NET 库",但我相信它只支持sftp。 FtpWebRequest 支持 ftps 和 ftp。 了解您的 FTP 服务器是否支持 sftp,并且您可能能够使用 SSH.NET 。 如果你唯一的选择是ftps,我可以报告我花了很长时间寻找一个免费的.net ftps客户端,我离开了FtpWebRequest。

FtpWebRequest支持HTTP代理(CONNECT命令是该支持的强制性部分)。您的代码是正确的。

虽然 HTTP 代理不支持上传(它适用于所有其他操作)。所以也许你的实际问题是上传,而你没有提到它。

对于通过HTTP代理的FTP上传,您必须使用第三方FTP客户端。


例如,对于 WinSCP .NET 程序集,您可以使用:

// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Ftp,
    HostName = "example.com",
    UserName = "user",
    Password = "mypassword",
};
// Configure proxy
sessionOptions.AddRawSettings("ProxyMethod", "3"); // HTTP proxy
sessionOptions.AddRawSettings("ProxyHost", "proxy");
using (Session session = new Session())
{
    // Connect
    session.Open(sessionOptions);
    // Upload file
    string localFilePath = @"C:'path'file.txt";
    string pathUpload = "/file.txt";
    session.PutFiles(localFilePath, pathUpload).Check();
}

有关SessionOptions.AddRawSettings的选项,请参阅原始设置。

更容易的是让WinSCP GUI为您生成C# FTP代码模板。

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

(我是WinSCP的作者)