2017-01-16 2 views
1

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

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"); 
} 

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

+0

на какой линии он замерзает? – BugFinder

+0

@BugFinder Он запускает Stream strm = reqFTP.GetRequestStream(); а затем он замораживает –

+1

Вы используете порт 990. Является ли сервер прослушиванием ftp на этом порту? Вы хотите использовать FTP или FTPS? Порт 990 предназначен для ftp TSL/SSL. Поскольку это хорошо известный номер порта (до 1028), он может быть заблокирован брандмауэром или антивирусной программой. Порт 990 предназначен для управления, и данные отправляются по разному номеру порта. Вы должны использовать сниффер, например wirehark или fiddler, чтобы помочь разработать код. – jdweng

ответ

2

.NET framework (FtpWebRequest) не поддерживает неявный TLS/SSL. Только явные, см .:
Does .NET FtpWebRequest Support both Implicit (FTPS) and explicit (FTPES)?

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


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

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

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


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

+0

Благодарим вас за ответ, но это не так просто. Когда я удалю: 990 из URL-адреса и перейду к ftp, я получу сообщение об ошибке «Я не могу подключиться к удаленному серверу». Я прочитал представленную вами статью, но я не хочу использовать третью стороннюю DLL. Но похоже, что использование третьей сторонней библиотеки dll является моим единственным вариантом. –

+0

Можете ли вы подключиться с помощью автономного FTP-клиента к серверу с использованием явного TLS/SSL? Например, WinSCP. –

+0

Я пробовал соединение с WinSCP с явным TLS/SSL, и это не удалось. Неявно обработанный штраф –

Смежные вопросы