2008-09-16 4 views
3

Кто-нибудь знает хороший, надеюсь, бесплатный класс FTP для использования в .NET, который действительно может работать за прокси-сервером HTTP или FTP-шлюзом? Материал FtpWebRequest в .NET в лучшем случае ужасен, и я действительно не хочу откатывать себя здесь.FTP-клиент для .NET.

+0

Мне любопытно, что не так с FTPWebrequest? ошибки? Или, возможно, он использует IE под капотом (что я предполагаю, что он делает) – 2011-11-09 05:50:28

+0

В FtpWebRequest есть много чего. Поддержка прокси-сервера оставляет желать лучшего. – 2012-05-23 03:36:35

ответ

-2

System.Net.WebClient может обрабатывать URL-адреса ftp, и с ними немного легче работать. Вы также можете установить учетные данные и информацию прокси.

+0

человек явно сказал, что это не вариант – DevelopingChris 2008-09-16 15:32:18

+0

Нет, он сказал, что FTPWebRequest не был вариантом. System.Net.WebClient - это совсем другой класс. – 2008-09-16 15:34:02

+0

Он изменил свой вопрос после некоторых ответов ... – 2008-09-16 15:35:12

1

Вы можете сделать "Indy.Sockets" попытку. Он может обрабатывать множество сетевых протоколов высокого уровня, включая ftp.

0

я использовал http://sourceforge.net/projects/dotnetftpclient/ для довольно долгого времени, и он делает работу красиво. Если вы используете соединение PASV, у вас не должно быть проблем с брандмауэром. Не уверен, что такое FTP-шлюз, но я не вижу, как HTTP-прокси повлияет на любое FTP-соединение.

2

Наши Rebex FTP работает с прокси-серверами просто отлично. Следующий код показывает, как подключиться к FTP с помощью HTTP-прокси (код берется с FTP tutorial page).

// 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

0

.Net 4.0+ теперь включает в себя FTP-клиент class- смотрите по этой ссылке MSDN для получения дополнительной информации.

http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx

я вижу варианты даже с помощью PASV режима и т.д., так что, как представляется, полностью функциональным (или я так надеюсь).

0

У меня была проблема с симулятором, создайте клиент для FTPS (явной) коммутации через прокси-сервер Socks4.

После некоторого поиска и тестирования я нашел .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(); 
0

Вот мой открытый исходный код C#, который загрузки файлов на FTP через HTTP прокси.

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; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^