2012-03-23 6 views
1

Я тестирую некоторые особенности WebClient класса, и я решил посмотреть, как DownloadProgressChanged работает так я сделал такой код:Show Progress Использование WebClient Скачать

static void Main(string[] args) 
{ 
    WebClient client = new WebClient(); 
    client.Proxy = null; 
    client.BaseAddress = "ftp://ftp.xxxxxxx.com"; 
    CredentialCache cache = new CredentialCache(); 
    NetworkCredential credential = new NetworkCredential("userxxx", "passxxxx"); 
    client.Credentials = credential; 
    client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged); 
    Uri remoteFile; 
    Uri.TryCreate("/public_html/folderxxxx/Pictures/Product/Resized/1.jpg", System.UriKind.Relative, out remoteFile); 

    client.DownloadFileAsync(remoteFile, "1.jpg"); 
    System.Diagnostics.Process.Start("1.jpg"); 
    Console.ReadLine(); 
} 

static void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
{ 
    Console.WriteLine(e.ProgressPercentage.ToString()); 
} 

Когда я запускаю это приложение, это то, что я вижу, как прогресс:

Console App Shows Progress

Выглядит ничего фантазии. Бен Албахари предлагает использовать новую тему вместо использования метода Async, и этот обработчик событий полезен, когда вы действительно используете метод Async.

Итак, как я могу показать прогресс по-настоящему?

EDIT:

Согласно MSDN это должно быть сделано:

Пассивная передачи файлов FTP всегда будет показывать прогресс процент нуля, так как сервер не отправлял размер файла , Для того, чтобы показать прогресс, вы можете изменить FTP соединение с активным путем переопределения GetWebRequest виртуальный метод:

Пример кода:

internal class MyWebClient:WebClient{ 
     protected override WebRequest GetWebRequest(Uri address) { 
      FtpWebRequest req = (FtpWebRequest)base.GetWebRequest(address); 
      req.UsePassive = false; 
      return req; 
     } 
    } 

Что я и сделал, но та же проблема бывает:

enter image description here

+0

вы убедились, что код на самом деле инициируя без пассивной загрузки? (Посмотрите на журналы сервера или что-то еще) –

ответ

3

Из MSDN:

Пассивная передача файлов FTP всегда будет показывать процент выполнения от нуля, так как сервер не отправил размер файла. Чтобы показать прогресс, вы можете изменить подключение FTP к активному, переопределив виртуальный метод GetWebRequest.

Source

+0

Нет, это не сработает. – Tarik

1

Вы читали documentation ??

Пассивная передача файлов FTP всегда будет показывать процентное соотношение , так как сервер не отправил размер файла. Для того, чтобы показать прогресс, вы можете изменить FTP соединение с активным путем переопределения GetWebRequest виртуального метода:

internal class MyWebClient:WebClient{ 
     protected override WebRequest GetWebRequest(Uri address) { 
      FtpWebRequest req = (FtpWebRequest)base.GetWebRequest(address); 
      req.UsePassive = false; 
      return req; 
     } 
    } 
+0

Ну, это не сработает. Я пробовал то, что было сказано в MSDN. – Tarik

1

Там, кажется, много людей, спрашивающих на этот вопрос.

Насколько я могу судить, ваш сервер будет сообщать только о прогрессе, если он установлен, вы разрешаете активные соединения. Похоже, что PASV (пассивный FTP) может быть включен или отключен на сервере. И используемый режим должен определяться тем, какой сервер настроен на использование, а также между сервером и клиентом.

EDIT: Я включил System.Net.Tracing в моем проекте и проработал как в пассивном, так и в активном режимах, и не только работает так, как ожидалось ...TotalBytes еще -1 поэтому мое мышление записку на MSDN

http://msdn.microsoft.com/en-US/library/system.net.webclient.downloadprogresschanged(v=vs.80).aspx

ошибается или мы что-то не хватает.

http://compnetworking.about.com/cs/protocolsftp/g/bldef_pasv.htm

http://slacksite.com/other/ftp.html

http://fetchsoftworks.com/fetch/help/Contents/Concepts/ActiveAndPassive.html

Так перекрывая WebRequest метод не будет иметь никакого значения, если сервер не использует активные соединения.

Однако ... как вы можете видеть из собственного показания командной строки, он правильно сообщает об ошибке BytesReceived.

Узнайте размер файла и вы уезжаете ...

Я ожидаю, что есть более эффективный метод, но ... Я использовал FtpWebRequest, чтобы получить размер файла перед загрузкой, а затем запустить DownloadFileAsync и передать размер файла в DownloadProgressCallback с помощью:

Client.DownloadProgressChanges += (sender, e) => DownloadProgressCallback(fileSize, e) 

Надеется, что это помогает :)

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