FtpWebRequest 使用显式 TLS/SSL

Pau*_*l L 6 .net c# ftp

我正在尝试通过显式 TLS/SSL 传输文件。

看起来 .NET 3.5 及以上版本中的 FtpWebRequest 无法工作,无论我是否启用 UsePassive。如果它被禁用,我认为有防火墙/路由器配置来处理(对于活动模式),一旦应用程序部署在客户端的计算机上,我就没有任何控制权,很可能不会立即工作。

但如果我禁用 UserPassive,它将抛出“服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同”。并根据这个线程:

服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 ,并且

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=97409&wa=wsignin1.0仍然不起作用。

顺便说一句,如果我确切地知道公共IP和内部IP,有没有办法让我接受新的内部IP地址,这样它至少可以工作?第一个链接使其正常工作,但我不明白他为什么以及如何做到这一点?myProxyServerIP是什么?我必须有代理服务器吗?

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

Mar*_*obr 4

有多个问题,让我们尝试一一解决:

为什么删除作品但上传、下载、上架却不能?

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.
Run Code Online (Sandbox Code Playgroud)

它可能会导致具有多个 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 客户端进行数据传输。它可以解决这个问题,但对防火墙不友好。当传入通信被阻止时(很常见),它将不起作用。

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

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

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

您可以下载试用看看是否能解决您的问题。