C# FTPS зависание / тайм-аут при подключении к порту 990

Я пытаюсь загрузить файлы на файлообменник FTPS. Но я не могу заставить код работать. При запуске приведенного ниже кода программа просто зависает, без каких-либо ошибок. В конце концов произойдет ошибка тайм-аута, которая говорит о системной ошибке. Я перепробовал много вещей, в том числе библиотеку и т.д. Есть ли у кого-нибудь опыт загрузки FTPS? Этот код работает с обычным FTP, который я пробовал.

var ftpServerIP = "Ftp.company1.company2.nl:990";
var ftpUserID = "Username";
var ftpPassword = "Password";

FileInfo fileInf = new FileInfo(@"D:\testfile.txt");
string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name;
FtpWebRequest reqFTP;

// Create FtpWebRequest object from the Uri provided
reqFTP =
    (FtpWebRequest)FtpWebRequest.Create(
        new Uri("ftp://" + ftpServerIP + "/IDEE_MOX/" + fileInf.Name));
reqFTP.EnableSsl = true;

// Provide the WebPermission Credintials
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");
}

Кто-нибудь знает, что не так с этим кодом и почему он зависает? Я вроде застрял здесь.

1 ответ

Решение

.NET Framework (FtpWebRequest) не поддерживает неявный TLS/SSL. Только явное, см.:
Поддерживает ли.NET FtpWebRequest как неявный (FTPS), так и явный (FTPES)?

Таким образом, вы не можете подключиться к порту 990 (неявный TLS/SSL).


Хотя ваш FTP-сервер, скорее всего, также поддерживает явный TLS/SSL, просто используйте его. Вы уже установили EnableSsl (что такое явный TLS/SSL). Так что просто подключитесь к стандартному порту 21 и все готово:

var ftpServerIP = "Ftp.company1.company2.nl"; 

(не нужно указывать явный порт, так как 21 является значением по умолчанию)


В редких случаях, когда ваш сервер не поддерживает явный TLS/SSL, вам нужно использовать стороннюю клиентскую библиотеку FTP. Некоторые упоминаются в вопросе, связанном выше. Моя сборка WinSCP .NET также поддерживает неявную FTPS. Поскольку вы уже установили соединение, работая с WinSCP GUI, используя неявный TLS/SSL, вы можете сгенерировать шаблон кода.

Другие вопросы по тегам