【发布时间】:2014-08-04 06:26:02
【问题描述】:
我在将 Windows 服务连接到 FTP 站点时遇到问题。
我从另一个开发人员那里继承了一项 Windows 服务。该服务连接到第 3 方服务器,下载 csv 文件,然后对其进行处理。由于某种原因,该服务停止工作(一年多以前,在我获得项目之前)。
所以我回到了基础,创建了一个控制台应用程序,并仅在该应用程序中尝试了连接/文件下载功能。我尝试了许多不同的方法来连接到 FTP,但它们都向我的应用程序返回相同的错误:
远程服务器返回错误:227 Entering Passive Mode ()
这是我尝试过的众多方法之一:
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) 语法错误,命令无法识别。
该文件托管在我无法控制的第 3 方 FTP 服务器上。我可以将 URL 粘贴到浏览器中,系统会提示我输入用户名和密码,然后我就可以通过并下载文件。
为了消除我们的防火墙作为问题的原因,我在内部网络和 WiFi(不在防火墙后面)上运行了该应用程序,这没有任何区别。我还在默认、主动和被动模式下通过 FileZilla 进行连接,并且每次都能正常工作。所以没有问题。
然后我运行了 Wireshark。这是在被动模式下使用 Filezilla(即成功的)捕获线路的图像:
这是使用应用程序连接(和失败)时的捕获,被动设置为 true:
所以正如您在上面的失败连接中看到的那样,我可以很好地登录服务器。然后无论出于何种原因发送了一个额外的请求,即“TYPE I”,它提示“切换到二进制模式”的响应。在下面,我得到以下内容:
500 oops:vsf_sysutil_recv_peek:无数据
另外我也把Passive属性设置为false后又跑了一次,这就是我当时得到的:
所以我的问题是双重的;
1,如果我以某种方式解决了 UsePassive 问题并将该属性设置为 false,那会解决我的问题吗?
2,忽略 UsePassive 属性,为什么我不能从应用程序下载文件,但可以从其他地方下载文件?
【问题讨论】:
-
是的,如果你使用 UsePassive=false 它应该消失anyay 2xx代码不是错误所以我猜这是.NET代码中的一个错误(错误是别的东西,但它报告最后执行的操作)。
-
感谢您的回复。我知道 227 不是错误代码,所以我假设 .NET 应用程序返回它,因为它是来自服务器的最后一次成功响应。我的 .net 代码位于顶部。有什么事情会因为你是错的而跳出来吗?我今天尝试了很多不同的方法,但它们都做同样的事情。
-
不,似乎没有任何问题(但我会尝试添加 request.UseBinary = true,无论有无 UsePassive)。似乎是服务器错误(或尝试建立 TCP 连接时由于防火墙导致客户端错误?)
-
是的,我尝试使用 UseBinary 属性。如果 UseBinary 为真且 Use Passive 为真,我会收到相同的 227 消息。如果 UseBinary 为 true 而 UsePassive 为 false,我会收到 500 错误。非常令人沮丧!我不认为它是服务器,因为我可以通过浏览器与 FileZilla 连接,并且就防火墙而言,我已经在防火墙后面连接并完全脱离它(通过访客 WiFi),没有任何变化。无论如何,谢谢,我想我将不得不继续在黑暗中不断地谷歌搜索......
标签: c# .net ftp ftpwebrequest