我试图编写一个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
,但它给了我同样的问题。
提前感谢您的帮助。
答案 0 :(得分:3)
FtpWebRequest
不支持某些操作的HTTP代理,包括文件上传。它显然是documented on MSDN:
如果指定的代理是HTTP代理,则仅支持DownloadFile,ListDirectory和ListDirectoryDetails命令。
对CodeProject的评论简直是胡说八道。你无法相信你在互联网上找到的一切。
WebClient
在内部使用FtpWebRequest
,因此您也无法使用它。
无法通过标准.NET框架库的HTTP代理将文件上传到FTP。
您必须使用第三方FTP库。
例如,使用WinSCP .NET assembly,您可以使用:
// 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
的选项,请参阅raw settings。
(我是WinSCP的作者)