我需要编写一个连接到 FTP 服务器的应用程序。此 FTP 服务器不允许被动模式连接。我可以使用 Filezilla 连接到 FTP 服务器。
我开发了一个 C# WCF 服务,它使用 FTPWebRequest 类连接到该 FTP 服务器。 以下是 FTPWebRequest 对象的基本设置:
ftpreq.Proxy = null;
ftpreq.KeepAlive = true;
ftpreq.UsePassive = false;
当我从 Visual Studio (Ctrl+F5) 运行 WCF 服务时,它会连接到 FTP 服务器并下载所需的文件,没有任何问题
但是当我在本地 IIS 7.5 中托管该服务时,它无法连接到 FTP 服务器并出现以下错误:
远程服务器返回错误:(425) 无法打开数据连接。
在谷歌上搜索这个问题后,我尝试绕过防火墙设置,但没有用。不确定是否与某些 IIS 安全问题或其他问题有关。
任何帮助将不胜感激
这是我的方式:
开始\控制面板\Windows防火墙\允许的程序。
这里!勾选应用程序上的复选框以允许其通过 Windows 防火墙。 记住!勾选“家庭/工作(私人)”复选框以及“公共”复选框。
祝你好运!
这是复杂的解决方案
步骤1 使用两个网络通道(端口和端口范围)的单个 ftp(非 ftps)。 第一个 (tcp:21) 用于身份验证,第二个用作数据的数据通道。
在iis上配置ftp时,打开21端口用于身份验证和控制通道,然后在iis控制面板的“FTP防火墙支持”中指定数据端口范围(5000-6000)以及与ftp服务器结合的网络接口的外部IP。
步骤2 最后,在 Windows 防火墙中打开 tcp:21 并创建自定义规则,允许 tcp:5000-6000 上的连接。重新启动系统(或只是重新启动服务)。
仅此而已。
ps。请记住,iis 上的 ftp 使用 tcp:21 进行控制/身份验证,使用 tcp:5000-6000 进行数据处理。 tcp:5000-6000 可能首先在 iis 管理器中进行更改,然后在 Windows 防火墙中打开。
我评论了这个设置:
UseBinary、代理、KeepAlive、UsePassive
现在效果很好:
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)WebRequest.Create(new Uri(ftpLocation + remoteDir));
//reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(ftpUser, ftpPassword);
reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
//reqFTP.Proxy = null;
//reqFTP.KeepAlive = false;
//reqFTP.UsePassive = false;
response = reqFTP.GetResponse();
reader = new StreamReader(response.GetResponseStream());
string line = reader.ReadLine();
同样的问题也发生在我身上。所以我做了以下操作并修复了它: