在被动模式

时间:2016-03-01 14:55:52

标签: c# ftp passive-mode

我的C#FTP上传脚本和新文件服务器出现问题。我用于上传的脚本在我的旧文件服务器上工作正常,但抛出:

System.Net.WebException: Cannot open passive data connection

当我尝试上传数据时。

    public static bool uploadFile(string aSourceUrl, string aUserName, string aPassword, string aSourceFileName, string aTargetFtpUrl, string aFilename, bool aPassiveMode = true)
    {
        string aFileurl = aSourceUrl + "/" + aSourceFileName;
        string aTargetUrl = aTargetFtpUrl + "/" + aFilename;
        Debug.Log("creating ftp upload. Source: " + aFileurl + " Target: " + aTargetUrl);
        System.IO.FileStream aFileStream = null;
        System.IO.Stream aRequestStream = null;

        try
        {
            var aFtpClient = (FtpWebRequest) FtpWebRequest.Create(aTargetUrl);
            aFtpClient.Credentials = new NetworkCredential(aUserName, aPassword);
            aFtpClient.Method = WebRequestMethods.Ftp.UploadFile;
            aFtpClient.UseBinary = true;
            aFtpClient.KeepAlive = true;
            aFtpClient.UsePassive = aPassiveMode;

            var aFileInfo = new System.IO.FileInfo(aFileurl);
            aFtpClient.ContentLength = aFileInfo.Length;
            byte[] aBuffer = new byte[4097];
            int aBytes = 0;
            int aTotal_bytes = (int) aFileInfo.Length;
            aFileStream = aFileInfo.OpenRead();
            aRequestStream = aFtpClient.GetRequestStream();
            while (aTotal_bytes > 0)
            {
                aBytes = aFileStream.Read(aBuffer, 0, aBuffer.Length);
                aRequestStream.Write(aBuffer, 0, aBytes);
                aTotal_bytes = aTotal_bytes - aBytes;
            }
            aFileStream.Close();
            aRequestStream.Close();
            var uploadResponse = (FtpWebResponse) aFtpClient.GetResponse();
            Debug.Log(uploadResponse.StatusDescription);
            uploadResponse.Close();
            return true;
        }
        catch (Exception e)
        {
            if (aFileStream != null) aFileStream.Close();
            if (aRequestStream != null) aRequestStream.Close();

            Debug.LogError(e.ToString());
            return false;
        }
   }

切换到活动模式时,我也有例外:

System.IO.IOException: Not connected

奇怪的是:如果我通过ftp客户端上传数据,它可以在两台服务器上运行,所以我的猜测是我的脚本中的内容可能会丢失。

有没有人暗示我可能会出现什么问题?正如我所提到的,该脚本在我的旧服务器上工作正常,我和我的服务器管理员认为两台服务器设置相似。

谢谢!

2 个答案:

答案 0 :(得分:0)

被动ftp不仅仅使用端口20和21 ....被动允许更多连接但使用+1024端口。它需要在防火墙中被允许,这通常是它失败的原因。

答案 1 :(得分:0)

好吧,在几次不同的尝试和调试会话之后,我们发现脚本在被动模式下工作正常。服务器配置为仅使用允许活动模式。

似乎FtpWebRequest不允许将端口和交换机设置为客户端无法在活动模式下使用的端口,因此在尝试打开服务器不支持的端口时失败(想要端口21)

解决方案似乎是找到FtpWebRequest的替代方法,它允许为活动模式指定使用的端口。