Проблема загрузки больших файлов через WebClient / FTP - PullRequest
3 голосов
/ 06 декабря 2011

В настоящее время я создаю приложение, которое, помимо прочего, собирается загружать большие файлы с FTP-сервера. Все отлично работает для небольших файлов (<50 МБ), но загружаемые файлы намного больше, в основном более 2 ГБ. </p>

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

DownloadClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgress);
DownloadClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadCompleted);

private void FileDownload()
{
    DownloadClient.DownloadFileAsync(new Uri(@"ftp://" + RemoteAddress + FilesToDownload[0]), LocalDirectory + FilesToDownload[0]));
}

private void DownloadProgress(object sender, DownloadProgressChangedEventArgs e)
{
    // Handle progress
}

private void DownloadCompleted(object sender, AsyncCompletedEventArgs e)
{
    FilesToDownload.RemoveAt(0);
    FileDownload();
}

С маленькими файлами это работает абсолютно нормально, все они загружаются один за другим, о прогрессе сообщается и после каждого файла запускается DownloadCompleted. Эта проблема, с которой я сталкиваюсь с большими файлами, состоит в том, что она запускает первую загрузку без каких-либо проблем, но ничего не делает после этого. Событие DownloadCompleted никогда не срабатывает по некоторым причинам. Похоже, WebClient не знает, что файл завершил загрузку, что является проблемой, поскольку я использую это событие для запуска следующей загрузки в списке FilesToDownload.

Я также пытался сделать это синхронно, используя WebClient.DownloadFile и цикл for для циклического просмотра моего списка FilesToDownload. Он правильно загружает первый файл, и я получаю исключение, когда должна начаться вторая загрузка: «Базовое соединение было закрыто: при получении произошла непредвиденная ошибка».

Наконец, я попытался пройти через FTP, используя edtFTPnet , но у меня возникают проблемы со скоростью загрузки (т.е. моя загрузка идет на полной скорости с WebClient, и я просто получаю 1/3 полной скорости с библиотекой edtFTPnet).

Есть мысли? Я должен признать, что у меня заканчиваются идеи здесь.

Ответы [ 2 ]

0 голосов
/ 02 января 2012

Забыл обновить эту ветку, но я понял, как с этим разобраться.

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

Теперь я перехватываю любое исключение FTP, сгенерированное клиентским объектом FTP во время загрузки, и выдаю команду REST со смещением, равным позиции в потоке данных, где передача остановлена ​​(т.е. общее количество байтов удаленного файла - в настоящее время загружено количество байтов). Это позволяет получить оставшиеся байты, отсутствующие в локальном файле.

0 голосов
/ 07 декабря 2011
public string GetRequest(Uri uri, int timeoutMilliseconds)
{
     var request = System.Net.WebRequest.Create(uri);
     request.Timeout = timeoutMilliseconds;
     using (var response = request.GetResponse())
     using (var stream = response.GetResponseStream())
     using (var reader = new System.IO.StreamReader(stream))
     {
         return reader.ReadToEnd();
     }
 } 
...