我在将Windows服务连接到FTP站点时遇到问题。
我从其他开发者那里继承了一个Windows服务。该服务连接到第三方服务器,下载csv文件,然后处理它。出于某种原因,该服务停止工作(一年多以前,在我获得该项目之前)。
所以我回到基础,创建了一个控制台应用程序,并尝试仅在该应用程序中的连接/文件下载功能。我已经尝试了许多不同的方法来连接到FTP,但是所有这些方法都会向我的应用程序返回相同的错误:
远程服务器返回错误:227进入被动模式()
这是我尝试过的众多方法之一:
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftpaddress/filename.csv");
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.Credentials = new NetworkCredential("username", "password");
request.UsePassive = true;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
Console.WriteLine(reader.ReadToEnd());
Console.WriteLine("Download Complete, status {0}", response.StatusDescription);
reader.Close();
response.Close();
但它落在了这一部分:
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
我在几个论坛中读到将UsePassive属性设置为False修复了这些错误,但发生在我身上的一切都是因为我得到了语法错误,如下所示:
远程服务器返回错误:(500)语法错误,命令无法识别。
该文件托管在我无法控制的第三方FTP服务器上。我可以将URL粘贴到浏览器中,系统会提示我输入用户名和密码,然后允许我通过,我可以下载该文件。
为了消除我们的防火墙作为问题的原因,我在内部网络和WiFi(不在防火墙后面)运行应用程序,它没有任何区别。我还通过FileZilla以默认,主动和被动模式连接,并且每次都有效。所以没问题。
然后我跑了Wireshark。这是使用Filezilla(即成功的)线程捕获的图像,处于被动模式:
以下是使用应用程序连接(和失败)时的捕获,被动设置为true:
因此,您可以在上面的失败连接中看到,我可以很好地登录到服务器。然后无论出于何种原因发送额外请求,即“TYPE I”,它提示“切换到二进制模式”的响应。在下面,我得到以下内容:
500 oops:vsf_sysutil_recv_peek:无数据
另外,在将Passive属性设置为false后我也再次运行它,这就是我得到的时间:
所以我的问题是双重的;
1,如果我以某种方式超越UsePassive问题并将该属性设置为false,那会解决我的问题吗?
2,忽略UsePassive属性,为什么我不能从应用程序下载文件,但可以从其他地方下载?
答案 0 :(得分:10)
问题现已解决。事实证明,卡巴斯基的内置防火墙阻止了连接。当我尝试连接时,它并没有向我发出警告,这令人讨厌,但让我放心地知道我的电脑是安全的。
线索在227回程的细节中:
10051 - 尝试对无法访问的网络执行套接字操作
此外,对于通过Google等进行此操作的任何人,远程服务器配置为仅允许被动连接,这就是我收到500语法错误的原因。在下载文件时研究线捕获显示,如果选择了Active但Filezilla实际上会自动恢复为被动模式。
我原帖中的代码现在运行正常。