任何人都知道在.NET 中使用的一个好的、希望是免费的 FTP 类,它实际上可以在 HTTP 代理或 FTP 网关后面工作?.NET 中的 FtpWebRequest 东西充其量是可怕的,我真的不想在这里推出我自己的东西。
10 回答
我们的Rebex FTP可以很好地使用代理。以下代码显示了如何使用 HTTP 代理连接到 FTP(代码取自FTP 教程页面)。
// initialize FTP client
Ftp client = new Ftp();
// setup proxy details
client.Proxy.ProxyType = FtpProxyType.HttpConnect;
client.Proxy.Host = proxyHostname;
client.Proxy.Port = proxyPort;
// add proxy username and password when needed
client.Proxy.UserName = proxyUsername;
client.Proxy.Password = proxyPassword;
// connect, login
client.Connect(hostname, port);
client.Login(username, password);
// do some work
// ...
// disconnect
client.Disconnect();
我遇到的最好的一个是 edtFTP.net http://www.enterprisedt.com/products/edtftpnet/overview.html
如果提供灵活性,您将无法获得内置类
我没有特别的经验,但Sharptoolbox提供了很多实现。
你可以试试“Indy.Sockets”。它可以处理很多高级网络协议,包括 ftp。
这是我通过 HTTP 代理将文件上传到 FTP 的开源 C# 代码。
public bool UploadFile(string localFilePath, string remoteDirectory)
{
var fileName = Path.GetFileName(localFilePath);
string content;
using (var reader = new StreamReader(localFilePath))
content = reader.ReadToEnd();
var proxyAuthB64Str = Convert.ToBase64String(Encoding.ASCII.GetBytes(_proxyUserName + ":" + _proxyPassword));
var sendStr = "PUT ftp://" + _ftpLogin + ":" + _ftpPassword
+ "@" + _ftpHost + remoteDirectory + fileName + " HTTP/1.1\n"
+ "Host: " + _ftpHost + "\n"
+ "User-Agent: Mozilla/4.0 (compatible; Eradicator; dotNetClient)\n" + "Proxy-Authorization: Basic " + proxyAuthB64Str + "\n"
+ "Content-Type: application/octet-stream\n"
+ "Content-Length: " + content.Length + "\n"
+ "Connection: close\n\n" + content;
var sendBytes = Encoding.ASCII.GetBytes(sendStr);
using (var proxySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
proxySocket.Connect(_proxyHost, _proxyPort);
if (!proxySocket.Connected)
throw new SocketException();
proxySocket.Send(sendBytes);
const int recvSize = 65536;
var recvBytes = new byte[recvSize];
proxySocket.Receive(recvBytes, recvSize, SocketFlags.Partial);
var responseFirstLine = new string(Encoding.ASCII.GetChars(recvBytes)).Split("\n".ToCharArray()).Take(1).ElementAt(0);
var httpResponseCode = Regex.Replace(responseFirstLine, @"HTTP/1\.\d (\d+) (\w+)", "$1");
var httpResponseDescription = Regex.Replace(responseFirstLine, @"HTTP/1\.\d (\d+) (\w+)", "$2");
return httpResponseCode.StartsWith("2");
}
return false;
}
I have used http://sourceforge.net/projects/dotnetftpclient/ for quite a while now, and it does the job nicely. If you use a PASV connection, you shouldn't have any firewall issues. Not sure what an FTP gateway is, but I don't see how the HTTP Proxy would affect any FTP connection.
我有一个类似的问题,通过 Socks4 代理为 FTPS(显式)通信创建一个客户端。
经过一番搜索和测试,我找到了 .NET 库 Starksoftftps。 http://starksoftftps.codeplex.com/
这是我的代码示例:
Socks4ProxyClient socks = new Socks4ProxyClient("socksproxyhost",1010);
FtpClient ftp = new FtpClient("ftpshost",2010,FtpSecurityProtocol.Tls1Explicit);
ftp.Proxy = socks;
ftp.Open("userid", "******");
ftp.PutFile(@"C:\519ec30a-ae15-4bd5-8bcd-94ef3ca49165.xml");
Console.WriteLine(ftp.GetDirListAsText());
ftp.Close();
我最近在我的项目中使用了它,效果很好。
.Net 4.0+ 现在包括一个 ftp 客户端类 - 请参阅此 msdn 链接了解更多信息。
http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx
我看到了甚至使用 PASV 模式等的选项,所以它似乎功能齐全(或者我希望如此)。
System.Net.WebClient 可以处理 ftp url,并且使用起来更容易一些。您也可以使用它设置凭据和代理信息。