【问题标题】:FTP client class for .NET.NET 的 FTP 客户端类
【发布时间】:2008-09-16 15:25:46
【问题描述】:

任何人都知道在.NET 中使用的一个好的、希望是免费的 FTP 类,它实际上可以在 HTTP 代理或 FTP 网关后面工作? .NET 中的 FtpWebRequest 东西充其量是可怕的,我真的不想在这里推出我自己的东西。

【问题讨论】:

  • 我很好奇 FTPWebrequest 有什么问题?错误?或者它在后台使用 IE(我认为它确实如此)
  • FtpWebRequest 有很多问题。一开始代理支持很差。

标签: .net proxy ftp gateway


【解决方案1】:

我们的Rebex FTP 可以很好地与代理配合使用。以下代码展示了如何使用 HTTP 代理连接到 FTP(代码取自 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下载试用版

【讨论】:

    【解决方案2】:

    我没有特别的经验,但sharptoolbox提供plenty implementations

    【讨论】:

      【解决方案3】:

      你可以试试"Indy.Sockets"。它可以处理很多高级网络协议,包括ftp。

      【讨论】:

      • 我使用它,但它确实有一些怪癖,比如留下临时文件。
      【解决方案4】:

      我遇到的最好的一个是 edtFTP.net http://www.enterprisedt.com/products/edtftpnet/overview.html

      如果提供了内置类所没有的灵活性

      【讨论】:

        【解决方案5】:

        我已经使用http://sourceforge.net/projects/dotnetftpclient/ 有一段时间了,它做得很好。如果您使用 PASV 连接,则不应有任何防火墙问题。不确定 FTP 网关是什么,但我看不出 HTTP 代理会如何影响任何 FTP 连接。

        【讨论】:

        • dotnetftpclient 不支持 HTTP 代理。
        【解决方案6】:

        我最近在我的项目中使用了它,效果很好。

        http://www.codeproject.com/KB/IP/ftplib.aspxt

        【讨论】:

          【解决方案7】:

          .Net 4.0+ 现在包含一个 ftp 客户端类 - 请参阅此 msdn 链接了解更多信息。

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

          我看到了甚至使用 PASV 模式等的选项,所以它看起来功能齐全(或者我希望如此)。

          【讨论】:

          • 此类是 OP 最初(相当准确地)描述为“可怕”的课程。这个类不是新的(它从 .NET 2.0 开始就存在)并且不以任何有用的方式支持代理。
          • OP 改变了我们的问题,使我的答案过时了。
          【解决方案8】:

          我有一个类似的问题,通过 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();
          

          【讨论】:

            【解决方案9】:

            这是我通过 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;
            }
            

            【讨论】:

            • 内置框架FtpWebRequest可以使用HTTP代理列出目录和下载文件,但是不能上传。
            • var request = (FtpWebRequest)WebRequest.Create(uri); request.Credentials = FtpCredentials; request.Proxy = new WebProxy(_proxyHost, _proxyPort) { Credentials = new NetworkCredential(_proxyUserName, _proxyPassword) }; request.UsePassive = true;使用 (var resp = request.GetResponse()) 使用 (var stream = resp.GetResponseStream()) .......
            【解决方案10】:

            System.Net.WebClient 可以处理 ftp url,并且使用起来更容易一些。您也可以使用它设置凭据和代理信息。

            【讨论】:

            • 不,他说 FTPWebRequest 不是一个选项。 System.Net.WebClient 完全是一个不同的类。
            • 我在 WebClient 中看到上传和下载,但没有删除。真的可以通过带有 WebClient 的 HTTP 代理在 FTP 上删除和重命名吗?
            • 非常确定 webclient 在任何情况下都使用 FtpWebRequest。
            猜你喜欢
            • 2017-03-28
            • 1970-01-01
            • 2018-07-07
            • 1970-01-01
            • 1970-01-01
            • 2011-01-28
            • 2011-08-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多