FtpWebResponse выдает исключение с кодом 550 при большом количестве файлов на FTP-сервере - PullRequest
0 голосов
/ 17 марта 2020

У меня следующая проблема с классом FtpWebResponse в c#. Net 4.5.1 во время выполнения. У меня есть сервер FTP с большим количеством файлов (около 1550 файлов). У меня есть код из более старого проекта, который кто-то еще написал, он проверяет, может ли быть установлено соединение с FTP-сервером и существует ли указанная папка. Код более или менее похож на этот:

string ftpUri= "some_ftp_url folder";
FtpWebRequest queryFTP = CreateFtpRequest(ftpUri);
queryFTP.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse webResponse = null;
try
{
    webResponse= (FtpWebResponse)queryFTP.GetResponse();        
}
catch (Exception ex)
{
    // Do some loging stuff
    return false;
}
finally
{
    webResponse?.Close();
}
return true;

Проблема в том, что при запуске в режиме отладки, если я отслеживаю шаг за шагом, все работает нормально. Однако, если я запускаю приложение без трассировки, я получаю ошибку 550 при достижении этой строки

    webResponse?.Close();

Если я уменьшу количество файлов в FTP-сервер работает нормально для всех случаев. Я подозреваю, что это как-то связано с тем, что в папке FTP много файлов и каким-то образом webResponse не завершил выполнение метода GetResponse() до получения вызова Close(). Тем не менее, я действительно озадачен этим поведением. Любая помощь будет оценена.

Я делюсь следом исключения. Это исключение типа System. Net .WebException:

удаленный сервер вернул ошибку: (550) Файл недоступен (например, файл не найден, не может получить доступ к файлу)

и трассировка исключения:

   à System.Net.FtpWebRequest.SyncRequestCallback(Object obj)
   à System.Net.CommandStream.Dispose(Boolean disposing)
   à System.IO.Stream.Close()
   à System.Net.ConnectionPool.Destroy(PooledStream pooledStream)
   à System.Net.ConnectionPool.PutConnection(PooledStream pooledStream, Object owningObject, Int32 creationTimeout, Boolean canReuse)
   à System.Net.FtpWebRequest.FinishRequestStage(RequestStage stage)
   à System.Net.FtpWebRequest.SyncRequestCallback(Object obj)
   à System.Net.CommandStream.Abort(Exception e)
   à System.Net.CommandStream.CheckContinuePipeline()
   à System.Net.FtpDataStream.System.Net.ICloseEx.CloseEx(CloseExState closeState)
   à System.Net.FtpDataStream.Dispose(Boolean disposing)
   à System.IO.Stream.Close()
   à System.Net.FtpWebResponse.Close()

Вот выдержка из файла журнала. Это по-французски, но понятно.

System.Net Information: 0 : [16364] ConnectStream#41366637::ConnectStream(Mise en mémoire tampon de 6954 octets.)
System.Net Information: 0 : [16364] Associating HttpWebRequest#38166093 with ConnectStream#41366637
System.Net Information: 0 : [16364] Associating HttpWebRequest#38166093 with HttpWebResponse#39307165
System.Net Information: 0 : [16364] ContentLength=-1
System.Net Information: 0 : [16364] ContentLength=-1
System.Net Information: 0 : [16364] FtpWebRequest#37702660::.ctor(ftp://ftpserver.my.local/FtpFolder/Stored)
System.Net Information: 0 : [16364] FtpWebRequest#37702660::GetResponse(Méthode=NLST.)
System.Net Information: 0 : [16364] FtpControlStream#34238661 - Connexion créée entre 10.15.27.102:64253 et 172.24.18.22:21.
System.Net Information: 0 : [16364] Associating FtpWebRequest#37702660 with FtpControlStream#34238661
System.Net Information: 0 : [16364] FtpControlStream#34238661 - Réponse reçue [220 Microsoft FTP Service]
System.Net Information: 0 : [16364] FtpControlStream#34238661 - Envoi de la commande [USER MYDOMAIN\MYUSER]
System.Net Information: 0 : [16364] FtpControlStream#34238661 - Réponse reçue [331 Password required]
System.Net Information: 0 : [16364] FtpControlStream#34238661 - Envoi de la commande [PASS ********]
System.Net Information: 0 : [16364] FtpControlStream#34238661 - Réponse reçue [230-Directory has 98,383,212,544 bytes of disk space available.
230 User logged in.]
System.Net Information: 0 : [16364] FtpControlStream#34238661 - Envoi de la commande [OPTS utf8 on]
System.Net Information: 0 : [16364] FtpControlStream#34238661 - Réponse reçue [200 OPTS UTF8 command successful - UTF8 encoding now ON.]
System.Net Information: 0 : [16364] FtpControlStream#34238661 - Envoi de la commande [PWD]
System.Net Information: 0 : [16364] FtpControlStream#34238661 - Réponse reçue [257 "/" is current directory.]
System.Net Information: 0 : [16364] FtpControlStream#34238661 - Envoi de la commande [CWD FtpFolder]
System.Net Information: 0 : [16364] FtpControlStream#34238661 - Réponse reçue [250 CWD command successful.]
System.Net Information: 0 : [16364] FtpControlStream#34238661 - Envoi de la commande [TYPE I]
System.Net Information: 0 : [16364] FtpControlStream#34238661 - Réponse reçue [200 Type set to I.]
System.Net Information: 0 : [16364] FtpControlStream#34238661 - Envoi de la commande [PASV]
System.Net Information: 0 : [16364] FtpControlStream#34238661 - Réponse reçue [227 Entering Passive Mode (172,24,18,22,200,148).]
System.Net Information: 0 : [16364] FtpControlStream#34238661 - Envoi de la commande [NLST Stored]
System.Net Information: 0 : [16364] FtpControlStream#34238661 - Réponse reçue [125 Data connection already open; Transfer starting.]
System.Net Information: 0 : [16364] FtpControlStream#34238661 - Réponse reçue [550 ]
System.Net Information: 0 : [16364] FtpWebRequest#37702660::(Libération de la connexion FTP # 34238661.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...