使用显式TLS/SSL的FtpWebRequest

问题描述:

我试图通过显式TLS/SSL传输文件。使用显式TLS/SSL的FtpWebRequest

看起来像.NET中的FtpWebRequest upto 3.5不会工作,或者我启用UsePassive或不。如果它被禁用,我认为有防火墙/路由器配置来处理(对于主动模式),一旦应用程序部署在客户端机器上,我没有任何控制权,并且很可能不会马上工作。

但是,如果我禁用了UserPassive,它将会抛出一个“服务器返回地址,以响应PASV命令,该地址与FTP连接的地址不同。并根据这个线索:

The server returned an address in response to the PASV command that is different than the address to which the FTP connection was made

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=97409&wa=wsignin1.0仍然无法正常工作。顺便说一句,如果我确切地知道公共IP和内部IP,有没有办法让我接受新的内部IP地址,所以它至少可以工作?第一个链接起作用,但我不明白他为什么以及如何管理这样做?什么是myProxyServerIP?我必须有代理服务器吗?

奇怪的是即使我的应用程序无法通过ftp下载文件或listdirectory,但它会成功删除服务器中的文件并提供成功代码?我的猜测是,我的应用程序只能通过/发送控制/命令代码到FTP服务器,但 无法通过服务器的其他端口获取数据?

存在多个问题,让我们尝试解决这些问题一个接一个:

为什么删除的作品,但上传,下载和列表不?

FTP协议使用两个单独的连接。第一(称为控制连接)用于以简单的响应的命令 - 诸如登录,删除,使目录等一般它运行在端口21

当FTP客户端请求的数据传输操作的另一连接(称为数据连接)成立。在主动模式下,FTP服务器连接到客户端,而在被动模式下,客户端连接到服务器。如果此连接被防火墙阻止,则数据传输操作失败。数据传输操作是上传,下载,还有目录列表。这就是为什么删除工作,而列表没有。

服务器如下返回响应于PASV命令的地址,它是比该FTP连接被制成

在被动模式FTP会话中的地址不同云:

client: PASV 
(i would like to transfer files. Tell me which port and ip address should I use) 

server: 227 Entering Passive Mode (172,16,3,4,204,173) 
(ok, use port 52397 on IP address 172.16.3.4.) 

client: connects to this IP address/port and starts data transfer. 

它可能导致多个IP地址的FTP服务器出现问题。我遇到了一些具有公共IP地址(比如说1.2.3.4)和私人IP地址(192.168.2.3)的FTP服务器。

当FTP客户端连接到公共IP地址(1.2.3.4)并请求数据传输操作时,服务器指示他使用私有IP地址(192.168.2.3)。这是不可能的,因为它是NAT。

解决方案

切换到活动模式。

活动模式FTP服务器连接到FTP客户端进行数据传输。它可以解决这个问题,但不是防火墙友好的。当传讯结果被*(非常常见)时,它不起作用。

忽略的IP地址发送作为响应PASV命令

如果公共的ftp服务器的IP地址是公用一个,并且IP地址返回作为PASV命令的响应是从私有范围(如10。 ,192.168。)。在这种情况下,FTP客户端应该使用公共IP地址。

这正是我们的Rebex FTP在这种情况下所做的。它运作良好(此行为可以关闭)。我不知道类似的解决方法是否可能与FtpWebRequest。

您可以download trial并检查它是否解决您的问题。

+0

谢谢Martin Vobr的解释,我有点理解我的第一个问题,我自己做了一些简单的阅读。不过,你的解释非常感谢。 – 2010-09-13 21:32:19

+0

我使用.NET 4.0下载了VS2010 Express,默认情况下它不需要选择被动或主动模式。我仍然在VS Express上试用我们应用程序的其他部分。不过,我会将您的意见转发给我的老板,以防他将考虑使用Delphi的第三方组件。再次感谢 – 2010-09-13 21:36:03