C# – 通过HTTP代理将文件上传到FTP

我正在尝试编写一个C#程序,将文件上传到通过代理服务器的FTP。

这是我写的代码:

public new bool Upload(string localFilePath, string pathUpload) { Stream FStream = null; bool retval = false; FileStream FlStream; try { FtpWebRequest FtpRequest = (FtpWebRequest) FtpWebRequest.Create(Uri + pathUpload); FtpRequest.Credentials = new NetworkCredential(User, Password); if (ProxyAddress != "" && ProxyAddress != null) { WebProxy ftpProxy = new WebProxy(); ftpProxy.Address = new System.Uri(ProxyAddress); ftpProxy.Credentials = new System.Net.NetworkCredential(ProxyUserId, ProxyPassword); FtpRequest.Proxy = ftpProxy; } FtpRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile; FStream = FtpRequest.GetRequestStream(); FileStream fs = File.OpenRead(localFilePath); byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); fs.Close(); FStream.Write(buffer, 0, buffer.Length); FStream.Close(); FStream.Dispose(); return retval = true; } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(e.ToString()); return false; } } 

如果我传递代理地址,则表示使用HTTP代理时不支持FTP命令。

我已经尝试过强制FtpRequest.Proxy = null如其他地方所建议的那样(例如http://www.codeproject.com/Questions/332730/FTP-proxy-problem-in-Csharp-application )但是它给了我一个例外“无法连接到远程服务器“。

我也尝试使用WebClient类而不是FtpWebRequest但它给了我同样的问题。

在此先感谢您的帮助。

FtpWebRequest不支持某些操作的HTTP代理,包括文件上载。 它在MSDN上清楚地记录在案 :

如果指定的代理是HTTP代理,则仅支持DownloadFile,ListDirectory和ListDirectoryDe​​tails命令。

对CodeProject的评论简直是胡说八道。 你无法相信你在互联网上找到的一切。

WebClient内部使用FtpWebRequest ,因此您也无法使用它。

没有办法通过标准.NET框架库的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"); 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的作者)