使用SSL在活动模式下上载FtpWebRequest会返回错误501

时间:2015-04-28 22:59:30

标签: c# ftp

这是我目前的代码:

    public bool ProcessFile(string fileName, string fileNameAndPath)
    {
        string address = string.Format("ftp://{0}/{1}", _address, fileName);
        ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(OnValidateCertificate);
        ServicePointManager.Expect100Continue = true;
        FtpWebRequest request = (FtpWebRequest) WebRequest.Create(address);
        request.Method = WebRequestMethods.Ftp.UploadFile;
        request.EnableSsl = true;
        request.UseBinary = false;
        request.UsePassive = false;
        request.Credentials = new NetworkCredential(_username, _password);
        if (!File.Exists(fileNameAndPath))
        {
            Log(string.Format("{0}ERROR - Locating file to migrate. Path - {1}", Environment.NewLine, fileNameAndPath));
            return false;
        }
        try
        {
            StreamReader fileIn = new StreamReader(fileNameAndPath);
            byte[] fileContents = Encoding.UTF8.GetBytes(fileIn.ReadToEnd());
            fileIn.Close();
            request.ContentLength = fileContents.Length;

            Stream requestStream = request.GetRequestStream();
            requestStream.Write(fileContents, 0, fileContents.Length);
            requestStream.Close();

            FtpWebResponse response = (FtpWebResponse)request.GetResponse();
            Log(string.Format("{0}File - {1} uploaded. Response Status: {2}", Environment.NewLine, fileNameAndPath, response.StatusDescription));
            response.Close();
            return true;
        }
        catch (Exception ex)
        {
            Log(string.Format("{0}ERROR - Upload routine. File - {1}. Error Exception: {2}", Environment.NewLine, fileNameAndPath, Util.GetFullError(ex)));
            return false;
        }
    }

假设port(21)提供了地址(host:21),并且凭据有效。我在GetRequestStream上得到一个例外,如下所示:

  

远程服务器返回错误:(501)参数中的语法错误   或论据。

我似乎无法弄清楚问题所在。我检查了一切。是的,我需要使用主动模式 - 不能做被动模式。是的,它使用SSL/TLS。这应该有效,但它没有,我在这里遗漏了一些东西。

需要一些关于这里可能出错的提示或指导。

1 个答案:

答案 0 :(得分:0)

启用堆栈跟踪后,我确定错误是缺少端口。简单地说,我的IT人员搞砸了,无法为我们的FTP正确设置主动。由于分配的端口在初始连接中返回且无法正​​常工作,因此FTP服务器将其拒绝为无效,并且.NET库解释了服务器错误消息。我的代码没有任何问题。