使用HTTP代理上传FTP文件

时间:2020-03-06 15:00:48  来源:igfitidea点击:

在HTTP代理后面时,是否可以将文件上传到FTP服务器?

似乎使用.Net Webclient的HTTP代理后面不支持上传文件。 (http://msdn.microsoft.com/zh-cn/library/system.net.ftpwebrequest.proxy.aspx)。

如果没有解决方法?如果没有,我们知道我可以使用的免费的好FTP库吗?

编辑:不幸的是,我没有任何要连接的FTP代理。

解决方案

我没有真正看到http代理与上传到ftp服务器之间的连接。如果我们使用http代理类,那就是通过http代理访问http资源。 ftp是另一个协议,而ftp代理使用不同的协议。

在活动FTP模式下,服务器启动与客户端的数据连接。如果客户端位于HTTP代理后面,则显然不起作用。在被动FTP模式下,客户端将启动初始连接和数据连接。由于HTTP代理可以(使用CONNECT方法)建立任意传出TCP连接的通道,因此应该可以通过HTTP代理以被动模式访问FTP服务器。

FtpWebRequest似乎支持被动模式。但是,我不明白为什么支持文件下载和目录列表,而不支持文件上传(它也使用相同的数据连接)。

我们是否已确认配置为被动模式的" FtpWebRequest"无法通过HTTP代理正常工作,通过HTTP代理,目录列表/文件下载就可以正常工作吗?

大多数FTP代理都会在连接上执行其任务,因此,如果没有代理,请执行以下操作:

  • 伺服器:myftpserver.com
  • 用户:我
  • 密码:pwd

使用FTP代理,我们可以执行以下操作:

它只是从那里解决。我正在通过鱿鱼代理使用这个正确的秒(试图调试某些东西)。

...但是我们没有FTP代理...

我们有SOCKS代理吗?那可能行得通,但是我不知道.NET是否可以做到。否则,说实话,我认为我们被困住了!与HTTP相比,FTP是一种"奇数"协议,因为它具有控制通道(端口21)和数据通道(或者在随机端口上有多个),因此通过代理进行访问很有趣。至少要说!

如果有一种方法可以让我们在没有Cthen的情况下通过FTP上传文件,那么在C#中也应该可以。通过浏览器或者FTP客户端上传是否可以正常工作?

我最喜欢的一个FTP库是.NET FTP客户端库。

正如亚历山大所说,HTTP代理可以代理任意流量。我们需要一个支持使用HTTP代理的FTP客户端。亚历山大(Alexander)也正确地说,这仅适用于被动模式。

我的雇主出售这样的FTP客户端,但这是一个企业级工具,仅作为超大型系统的一部分提供。

我敢肯定,还有其他更适合我们需求的产品。

一种解决方案是尝试Mono的FtpWebRequest实现。我看了一下它的源代码,它看起来很容易修改,因此所有连接(控件和数据)都可以通过HTTP代理进行隧道传输。

我们建立到HTTP代理的TCP连接,而不是实际的FTP服务器。然后,我们发送" CONNECT myserver:21 HTTP / 1.0",后跟两个CRLF(CRLF = \ r \ n)。如果代理需要身份验证,则需要使用HTTP / 1.1,并且还发送带有凭据的代理身份验证标头。然后,我们需要阅读响应的第一行。如果它以" HTTP / 1.0 200"或者" HTTP / 1.1 200"开头,那么我们(代码的其余部分)可以继续使用该连接,就像它直接连接到FTP服务器一样。

我们的Rebex FTP / SSL可以使用HTTP代理。它不是免费的,但是...

// 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();

我刚刚遇到了同样的问题。

我的主要目标是将文件上传到ftp。而且我不在乎我的流量是否会通过代理。

因此,我刚刚在FTPWebRequest.Create(uri)之后将FTPWebRequest.Proxy属性设置为null。

而且有效。是的,我知道这种解决方案不是最好的解决方案。更重要的是,我不知道为什么它起作用。但是无论如何,目标是完整的。