Ошибка FTP при доступе к каталогу на FTP-сервере через SSL - PullRequest
0 голосов
/ 25 февраля 2020

Я разработал веб-сервис в C#. Net 4.5, который подключается к ftp-серверу (с SSL) и перечисляет все файлы, хранящиеся в каталоге на ftp-сервере. Код работал хорошо в прошлом году (начало 2019 года или конец 2018 года), но так как я снова тестировал код 3 недели go, и он больше не работает. Я пробовал много вещей:

-Я изменил целевой фреймворк с 4.5 на 4.8 ( Ссылка на статью )

-Использую пакет nuget fluentFTP (но я имеют ту же ошибку

Дело в том, что я могу подключиться к ftp-серверу с помощью Filezilla и получить доступ к каталогу без каких-либо ошибок (поэтому я предполагаю, что это не проблема брандмауэра) Я проверил журналы ftp обмен между моим компьютером и сервером ftp, и ошибка происходит во время команды ftp MLSD -> Открытие канала данных для списка каталога "каталог" (последнее сообщение от сервера ->. Net ошибка: "аутентификация не удалась, потому что удаленная сторона закрыл транспортный поток "

Вот код:

            FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://urlFtpServer:21/directory");
            request.Method = WebRequestMethods.Ftp.ListDirectory;
            request.EnableSsl = true;
            // Sets the user login and password.  
            request.Credentials = new NetworkCredential("login", "password");

            request.KeepAlive = true;

            try
            {
                // Send the request.
                using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
                {
                    using (Stream responseStream = response.GetResponseStream())
                    {
                        using (StreamReader reader = new StreamReader(responseStream))
                        {
                            IEnumerable<string> lstDirectoryFiles = reader.ReadToEnd()
                                                                   .Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

                            // Use the user criteria to get only the file needed.
                            if (string.IsNullOrEmpty(in_searchPattern))
                                return lstDirectoryFiles.ToList();

                            Regex rgx = new Regex(in_searchPattern);

                            return lstDirectoryFiles.Where(st => rgx.IsMatch(st)).ToList();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                //Here is the exception: authentication failed because the remote party has closed the transport stream
            }

Пожалуйста, помогите:)

Я забыл упомянуть, что метод запроса ftp WebRequestMethods.Ftp.MakeDirectory отлично работает

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

Это в основном вызвано слишком низким типом протокола безопасности приложения.

Установите SecurityProtocol в вашем приложении, добавив эту строку.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

Это можно добавить непосредственно перед Вы вызываете FTP, или его можно добавить в метод запуска приложения.

0 голосов
/ 25 февраля 2020

Это может быть связано с поддержкой TLS FTP-сервером.

Попробуйте установить в ServicePointManager.SecurityProtocol различные варианты TLS.

Эта статья может также быть полезным.

...