C # FTPS FtpWebRequest установить пассивный режим для использования диапазона портов - PullRequest
1 голос
/ 02 июля 2019

Я не могу подключиться к определенному FTP с использованием C # FtpWebRequest.

С TotalCommander или FileZilla я могу подключиться.

Информация о FTP говорит:

  • FTPS - неявный SSL / TLS

  • Порт 990

  • Диапазон пассивных портов: 60000–60100

Другой FTP работает хорошо.

var remoteFile = "ftp://ADDRESS:990/FILE.csv";
var localFile = Server.MapPath("~/tmp/file.csv");

int bufferSize = 2048;

if (!Directory.Exists(Path.GetDirectoryName(localFile)))
    Directory.CreateDirectory(Path.GetDirectoryName(localFile));
/* Create an FTP Request */
FtpWebRequest ftpRequest = (FtpWebRequest)FtpWebRequest.Create(remoteFile);
/* Log in to the FTP Server with the User Name and Password Provided */
ftpRequest.Credentials = new NetworkCredential("USER", "PWD");
/* When in doubt, use these options */
ftpRequest.UseBinary = true;
ftpRequest.UsePassive = true;
ftpRequest.KeepAlive = true;

ftpRequest.EnableSsl = true;
// Always returns true
ServicePointManager.ServerCertificateValidationCallback = OnValidateCertificate; 

/* Specify the Type of FTP Request */
ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
/* Establish Return Communication with the FTP Server */
FtpWebResponse ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
/* Get the FTP Server's Response Stream */
Stream ftpStream = ftpResponse.GetResponseStream();
/* Open a File Stream to Write the Downloaded File */
FileStream localFileStream = new FileStream(localFile, FileMode.Create);
/* Buffer for the Downloaded Data */
byte[] byteBuffer = new byte[bufferSize];
int bytesRead = ftpStream.Read(byteBuffer, 0, bufferSize);
/* Download the File by Writing the Buffered Data Until the Transfer is Complete */
try
{
    while (bytesRead > 0)
    {
        localFileStream.Write(byteBuffer, 0, bytesRead);
        bytesRead = ftpStream.Read(byteBuffer, 0, bufferSize);
    }
}
catch (Exception ex)
{
    Console.WriteLine(ex.ToString());
}
/* Resource Cleanup */
localFileStream.Close();
ftpStream.Close();
ftpResponse.Close();
ftpRequest = null;

На мой взгляд, ошибка вызвана пассивным диапазоном портов 60000–60100. Но я не знаю, как его настроить.

1 Ответ

1 голос
/ 02 июля 2019

Диапазон пассивных портов FTP является конфигурацией на стороне сервера.

Вы не устанавливаете диапазон пассивных портов на стороне client - FileZilla или Total Commander также не имеют такой опции конфигурации,FTP-клиент использует порт , выбранный сервером .


Ваша настоящая проблема заключается в том, что .NET / FtpWebRequest не поддерживает неявный TLS / SSL:
Поддерживает ли .NET FtpWebRequest как неявный (FTPS), так и явный (FTPES)?

...