【问题标题】:FTP error 227 entering passive mode进入被动模式的 FTP 错误 227
【发布时间】:2013-09-25 12:27:03
【问题描述】:

我正在尝试将文件上传到 ftp 服务器。尝试了一些代码示例,但总是出现此错误,进入被动模式。例如,我可以用这段代码创建一个目录

FtpWebRequest reqFTP;
try
{
    // dirName = name of the directory to create.
    reqFTP = (FtpWebRequest)FtpWebRequest.Create(
             new Uri("ftp://" + ftpServerIP + "/" + dirName));
    reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
    reqFTP.UseBinary = true;
    reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
    reqFTP.UsePassive = false;
    FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
    Stream ftpStream = response.GetResponseStream();

    ftpStream.Close();
    response.Close();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

或者例如我可以重命名一个文件。但无法使用此代码上传文件

string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name;
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(
         "ftp://" + ftpServerIP + "/" + fileInf.Name));
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
reqFTP.KeepAlive = false;
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
reqFTP.UseBinary = true;
reqFTP.ContentLength = fileInf.Length;

int buffLength = 2048;
byte[] buff = new byte[buffLength];
int contentLen;

FileStream fs = fileInf.OpenRead();

try
{
    Stream strm = reqFTP.GetRequestStream();
    contentLen = fs.Read(buff, 0, buffLength);
    while (contentLen != 0)
    {
        strm.Write(buff, 0, contentLen);
        contentLen = fs.Read(buff, 0, buffLength);
    }
    strm.Close();
    fs.Close();
}
catch(Exception ex)
{
    MessageBox.Show(ex.Message, "Upload Error");
}

reqFTP.GetRequestStream() 出现异常。

如果我使用reqFTP.UsePassive=false,那么我会得到“

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

我该怎么办?

【问题讨论】:

  • 任何有此问题的人,append a log 到该问题(或发布新问题并在此处链接)。没有日志,问题就无法回答。
  • 由于卡巴斯基杀毒软件,我今天遇到了这个问题。如果我暂停卡巴斯基并重试一切正常

标签: c# ftp ftpwebrequest


【解决方案1】:

所以,我知道这是一个迟到的答案,但我想分享我的经验,以防有人会遇到同样的事情。

在我的例子中,我从 Windows Server 2016 下载了一些文件。出于安全原因,我激活了防火墙,当然我在防火墙中添加了一个入站规则以允许 20 和 21 端口。

我遇到了同样著名的错误:227 进入被动模式。 我检查了代码,在错误中,它总是指示一些不同的端口。

经过一番搜索,我发现我必须在允许的端口中添加 49152-65534。

它奏效了。

这是我的代码

   public static bool DownloadDocument(string ftpPath, string downloadPath)
    {
        bool retVal = false;
        try
        {
            if (!Directory.Exists(Tools.LocalPath))
                Directory.CreateDirectory(Tools.LocalPath);

            using (WebClient client = new WebClient())
            {
                client.Credentials = new NetworkCredential(Tools.FtpUserName, Tools.FtpPassword);
             
                client.DownloadFile(ftpPath, downloadPath);
            }
            retVal = true;
        }
        catch (Exception ex)
        {
            UserMethods.ParseError(ex, "DownloadFile");
        }

        return retVal;
    }

【讨论】:

    【解决方案2】:

    试试这个例子

    http://social.msdn.microsoft.com/Forums/en-US/0128e595-c8e2-4f5e-9426-fd93eb510cab/the-remote-server-returned-an-error-227-entering-passive-mode-67228534212130

    如果您将 UsePassive 设置为 false,那么您需要确保命令通道的端口是开放的(即,您需要定义端点和访问规则)。除非有充分的理由不使用被动,否则最好使用被动。

    希望它会有所帮助。

    【讨论】:

    • 正如我所说,如果我使用 reqFTP.UsePassive=false,那么我会得到“远程服务器返回错误:(500) 语法错误,命令无法识别”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 2019-08-05
    • 2013-03-09
    • 1970-01-01
    相关资源
    最近更新 更多