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, вы можете сгенерировать шаблон кода.