2010-02-16 2 views
5

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

Код экстракт:

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

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

strm.Close(); 

Там не является исключением, как эта часть находится в примерке уловом.

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

+1

Как вы используете класс FtWebRequest?У вас есть проблемы со всеми FTP-серверами или только с одним? –

+1

Что вы подразумеваете под «в конечном итоге в проблеме». Не могли бы вы разместить определенную трассировку стека или неправильное поведение? – abc

+0

Извините, если кто-то отредактировал мой вопрос, вы можете сделать это снова, пожалуйста. – kobra

ответ

6

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

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

Edit:

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

+0

Спасибо. В моем коде KeepAlive является ложным, и я попытался «использовать», но код никогда не выходит из блока «using». Что касается ошибок, я не получаю никаких исключений, что затрудняет отслеживание проблемы. – kobra

+0

Вы используете активный или пассивный режим? – Jacob

+0

И когда вы говорите: «Не существует исключения, поскольку эта часть находится внутри try-catch», вы говорите, что блок catch не достигнут или что try/catch маскирует ваше исключение? – Jacob

0

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

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

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

+0

FtpWebRequest никогда не использовал порт 80 для нас. Откуда вы получаете эту информацию? – Jacob

+0

@Jacob: Почему он называется FtpWebRequest ... он использует протокол http для связи с FTP-сервером ... ключевое слово в названии !! Зачем использовать WebRequest для создания FtpWebRequest? Если вы не согласны ... почему нет специального ftp-компонента для прямой связи с портом 21? Это обернуто вокруг этого класса WebRequest ... – t0mm13b

+2

Это просто плохое имя. HttpWebRequest использует порт 80, а FtpWebRequest использует порт 21. WebRequest является абстрактным базовым классом для обоих. – Jacob

Смежные вопросы