HTTP プロキシまたは FTP ゲートウェイの背後で実際に動作する、.NET で使用するための優れた、できれば無料の 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();
試用版はwww.rebex.net/ftp.net/download.aspx からダウンロードできます。
私が遭遇した最高のものは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;
}
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();
私はかなり長い間http://sourceforge.net/projects/dotnetftpclient/を使用してきましたが、うまく機能します。PASV 接続を使用する場合、ファイアウォールの問題は発生しないはずです。FTP ゲートウェイが何であるかはわかりませんが、HTTP プロキシが FTP 接続にどのように影響するかはわかりません。
私は最近私のプロジェクトでこれを使用しましたが、うまくいきました。
System.Net.WebClient は ftp url を処理でき、操作が少し簡単です。資格情報とプロキシ情報も設定できます。