Ftp GetFileSize случайным образом выдает ошибку FTP 503 (неверная последовательность команд) - PullRequest
2 голосов
/ 15 января 2009

Чтобы получить размер файла для каждого файла в списке файлов, я использую следующий код:

foreach (String f in files)
{
  UriBuilder ftpUri = new UriBuilder("ftp", ftpServer, -1, ftpPfadZuLogDateien + "/" + f);
  FtpWebRequest ftpclientRequest1 = (FtpWebRequest)WebRequest.Create(ftpUri.Uri);
  ftpclientRequest1.Method = WebRequestMethods.Ftp.GetFileSize;
  ftpclientRequest1.Credentials = new NetworkCredential(ftpLoginName, ftpPassword);
  FtpWebResponse response1 = (FtpWebResponse)ftpclientRequest1.GetResponse();
  long filesize = response1.ContentLength;
  response1.Close();
  // store the file size somewhere
}

Если в списке всего несколько файлов, это обычно работает. Но после некоторых из этих запросов (иногда 10, иногда 100) подряд GetResponse () выдаст ошибку 503 (неверная последовательность команд).

Что эта ошибка пытается сказать мне? Я опрашиваю слишком быстро? Забыть убрать любой ресурс?
И что я могу с этим поделать?

дополнительная информация:
Установка KeepAlive = false для соединения приводит к сбою во втором запросе с ошибкой 550 (файл не найден / доступ запрещен?).
Установка UsePassive = false ничего не изменила.
Установка UseBinary = true ничего не изменила.
Удар головой по клавиатуре ничего не изменил.

[Update] beckr.org предоставил ответ - так как он скрыт за ссылкой и большим количеством текста, здесь короткая версия: я изменил источник, поэтому я бы использовал NetworkCredentials:

NetworkCredential myCredentials = new NetworkCredential(ftpLoginName, ftpPassword);
foreach (String f in files)
{
  UriBuilder ftpUri = new UriBuilder("ftp", ftpServer, -1, ftpPfadZuLogDateien + "/" + f);
  FtpWebRequest ftpclientRequest1 = (FtpWebRequest)WebRequest.Create(ftpUri.Uri);
  ftpclientRequest1.Method = WebRequestMethods.Ftp.GetFileSize;
  ftpclientRequest1.Credentials = myCredentials;
  FtpWebResponse response1 = (FtpWebResponse)ftpclientRequest1.GetResponse();
  long filesize = response1.ContentLength;
  response1.Close();
  // store the file size somewhere
}

Таким образом, все работает так, как должно.

1 Ответ

4 голосов
/ 10 февраля 2009

Выполните трассировку с помощью Wireshark - код состояния 503, но сообщение скорее всего что-то другое. В моем случае FtpWebRequest проводил повторную проверку подлинности каждые 3 запроса или около того с помощью USER xyz, в результате чего сервер (ProFTPD) отвечал «503 Вы уже вошли в систему», что вызывает сбой FtpWebRequest. См. Обратная связь Microsoft о том, почему это происходит на http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/9f0510f9-fa39-4aa4-8bd5-afb926282144/. Если бы Microsoft (правильно) открыла исходные тексты, у меня не было бы проблемы с этой ошибкой, потому что я могла бы просто исправить ее самостоятельно, предоставить патч, и он, скорее всего, пойдет в дальнейшие выпуски. Но это не так, как все работает в Microsoft. Сейчас заглядываю в http://sourceforge.net/projects/dotnetftpclient/.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...