Загрузка FTP с помощью.NET

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

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

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

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

strm.Close();

Нет никакого исключения, как эта часть в выгоде попытки.

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

5
задан John Saunders 16 February 2010 в 01:48
поделиться

2 ответа

Я не знаю конкретно, какую ошибку вы получаете при закрытии потока, но в нашем приложении мы выполняем много загрузок больших файлов (видео и изображений). Вот как мы пишем в наш 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);
}

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

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

Редактировать:

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

6
ответ дан 14 December 2019 в 13:34
поделиться

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

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

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

0
ответ дан 14 December 2019 в 13:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: