【问题标题】:The remote server returned an error: 227 Entering Passive Mode (500 oops vs_utility_recv_peek: no data)远程服务器返回错误:227 Entering Passive Mode (500 oops vs_utility_recv_peek: no data)
【发布时间】: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


【解决方案1】:

问题现已解决。原来是卡巴斯基的内置防火墙阻止了连接。很烦人,当我尝试连接时它没有向我显示警告,但知道我的电脑是安全的。

线索在 227 返回的细节中:

10051 – 尝试对无法访问的网络进行套接字操作

此外,对于通过 Google 等访问此内容的任何人,远程服务器被配置为仅允许被动连接,这就是我收到 500 语法错误的原因。研究下载文件时的 Wire 捕获发现,如果选择 Active 但失败,Filezilla 实际上会自动恢复到 Passive 模式。

我原来帖子中的代码现在可以正常工作了。

【讨论】:

  • 那么我应该如何处理卡巴斯基的?
  • 我遇到了同样的问题,但不是卡巴斯基,而是 IIS 8.5。我不得不使用此处的答案重新启动 FTP 服务来解决问题:serverfault.com/questions/309964/…
猜你喜欢
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多