系统.Net.Web异常:服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同。
在 System.Net.FtpWebRequest.CheckError()
在 System.Net.FtpWebRequest.SyncRequestCallback(对象 obj)
在 System.Net.CommandStream.Abort(异常 e)
在 System.Net.FtpWebRequest.FinishRequestStage(RequestStage 阶段)
在 System.Net.FtpWebRequest.GetRequestStream()
在 D:\PROJEKTI\BackupDB\BackupDB\Program.cs 中的 BackupDB.Program.FTPUploadFile(String serverPath、String serverFile、FileInfo LocalFile、NetworkCredential Cred):第 119 行

代码:

FTPMakeDir(new Uri(serverPath + "/"), Cred);
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverPath+serverFile);
request.UsePassive = true;
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = Cred;
byte[] buffer = new byte[10240];    // Read/write 10kb

using (FileStream sourceStream = new FileStream(
    LocalFile.ToString(), FileMode.Open))
{
    using (Stream requestStream = request.GetRequestStream())
    {
        int bytesRead;
        do
        {
            bytesRead = sourceStream.Read(buffer, 0, buffer.Length);
            requestStream.Write(buffer, 0, bytesRead);
        } while (bytesRead > 0);
    }
    response = (FtpWebResponse)request.GetResponse();
    response.Close();
}
有帮助吗?

解决方案 2

如果有人遇到相同的问题,这是proftpd的解决方案

http://www.proftpd.org/docs/howto/nat.html

其他提示

我的天啊。这里的所有panding都在购买他们的第三方解决方案,而不是通知您更改一行代码?

尝试切换被动值以查看哪个有效:

    request.UsePassive = false;

这可能取决于机器(客户端和服务器)之间的防火墙。

我注意到如果我通过我们的防火墙,我需要将其留在True,否则会返回例外:

远程服务器返回一个错误:(500)语法错误,命令未识别。

但是,如果我在防火墙后面(就像两台在数据中心内直接连接的机器),那么我需要将其设置为false,否则它将返回异常:

该服务器返回了对PASV命令的地址,该地址与建立FTP连接的地址不同。

如果这起作用,并且要使解决方案更加适应性,则可以使用默认的真实值将请求包装在try-catch块中,并且如果收到500错误,请切换使用false,然后重试。

在被动模式下,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地址(例如1.2.3.4)的FTP服务器返回一个专用IP地址作为对PASV命令的响应。

解决方案

切换到活动模式。

在活动模式下,FTP服务器连接到FTP客户端以进行数据传输。它将解决这个问题,但不友好。当传入连接被阻止(非常常见)时,它将无法工作。

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

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

这正是我们的 Rebex FTP 在这种情况下做。它运行良好(可以关闭此行为)。它甚至可以打开具有多个公共IP地址的服务器。

我不知道FTPWebrequest是否可以使用类似的解决方法。

你可以 下载试用版 并检查它是否解决了您的问题。

经过大量研究后,我发现解决此问题的唯一方法是更改​​服务器上的 PASV 设置。

幸运的是,我控制了客户端和服务器计算机,因此我能够告诉服务器(在我的例子中是 FileZilla)使用公共 IP 而不是私有 IP。

您的FTP服务器被错误配置。

在被动模式下,服务器报告了客户端应连接到数据传输的IP地址和端口。您的FTP服务器在内部网络中报告其IP地址,尽管它是防火墙/NAT的后面。客户由于明显的原因无法连接到该内部地址。您必须配置FTP服务器以报告其外部IP地址。

这是如何完成服务器特定的,您没有告诉我们您的FTP服务器是什么。


这里有一些答案建议使用活动模式。

request.UsePassive = false;

但是,只有在客户端和服务器之间没有防火墙/NAT时,才能有所帮助,在这种情况下,您首先不会出现问题(除非服务器真的被打破并报告完全错误的IP地址,而不仅仅是内部)。或者,如果配置了防火墙/NAT以允许入站连接,则不是通常的。


另一种方法是使用不同的FTP库,该库可以通过忽略服务器报告的不正确的IP地址和使用主/控制连接IP地址来解决问题。或使用 EPSV 命令而不是 PASV 隐式使用主/控制连接IP地址的命令。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top