FTP загрузка с использованием .NET - PullRequest
5 голосов
/ 16 февраля 2010

Я пишу код для загрузки ZIP-файла на FTP-сервер. Удивительно, но код отлично работает для небольших файлов, но с большими файлами я сталкиваюсь с проблемой. Я использую объект Stream, и я заметил, что мой код застревает при попытке закрыть поток (только для больших файлов). Код работает нормально, если я не закрываю поток (даже для больших файлов). Кто-нибудь видит какую-то логику в том, почему это происходит? И если я не закрою поток, возможно ли, что в будущем у меня могут возникнуть проблемы.

Извлечение кода:

FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(@"ftp://" + ftpServerIP + @"/" + fileInf.Name));
Stream strm = reqFTP.GetRequestStream();

Код перестает отвечать (если размер загружаемого файла большой):

strm.Close();

Нет исключений, так как эта часть находится в пределах try-catch.

Я не знаю, как получить трассировку стека.

Ответы [ 2 ]

6 голосов
/ 16 февраля 2010

Я не знаю точно, какую ошибку вы получаете при закрытии потока, но в нашем приложении мы делаем много больших загрузок файлов (видео и изображений). Вот как мы пишем в наш поток FTP:

request.KeepAlive = false; // This eliminated some of our stream closing problems

using (Stream stream = request.GetRequestStream())
{
    stream.Write(file.Data, 0, file.Data.Length);
}

Я думал, что выполнение блока using будет эффективно выполнять вызов Close самостоятельно, но, возможно, он также выполняет другую необходимую очистку. Также обратите внимание, что я отключил поддержку активности FTP, что вызвало у нас проблемы на некоторых сторонних FTP-сайтах, на которые мы загрузили.

Вы действительно должны смотреть на конкретное исключение, которое вы получаете, а не глотать все исключения. Сообщение об ошибке, скорее всего, скажет вам, что не так. Наиболее распространенные проблемы, с которыми мы столкнулись, были связаны с активным или пассивным режимом и поддержкой активности.

Edit:

Чтобы выяснить, что на самом деле происходило, когда у нас были проблемы с FTP с CDN (а это происходит слишком часто), нам иногда приходилось включать трассировку в нашем приложении. См. эту ссылку , чтобы узнать, как включить трассировку. Другой вариант - использовать такой инструмент, как Wireshark, чтобы прослушать диалог между вашим приложением и FTP-сервером. Если вы видите, что происходит в протоколе FTP, у вас будет гораздо больше шансов решить проблему.

0 голосов
/ 16 февраля 2010

Возможно, стоит попробовать компонент FTP с открытым исходным кодом из здесь ... Я пытался использовать FtpWebRequest, и мой опыт использования этого был отрицательным ... медленно, время ожидания, потому что вполне естественно, FtpWebRequest работает через порт 80 вместо собственного порта 21 ... ситуация изменилась довольно резко, когда я использовал этот компонент FTP, более универсальный и мощный ...

Редактировать: Как Джейкоб указал на мою очевидную ошибку и мой нелогичный взгляд на класс FtpWebRequest, который привел меня к мысли, что происходит что-то странное и странное и что он что-то делал через HTTP ... Ну, у Джейкоба должен быть смысл ... классический случай плохого соглашения об именах в Framework ... Спасибо, Джейкоб!

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

...