Возобновление загрузки в C # WPF - PullRequest
0 голосов
/ 03 января 2019

Я разрабатываю приложение WPF, которое загружает некоторые файлы MSI, размер которых превышает 100 МБ.Во время загрузки, если Интернет отключен, текущий загружаемый файл должен возобновиться с того места, где загрузка была прервана.Я использовал WebClient и Cookies для загрузки файлов.Файлы не возобновляются, если Интернет был отключен и снова подключен.Я использовал следующий код.Может кто-нибудь предложить мне, как добиться процесса возобновления?

using (CookieAwareWebClient client = new CookieAwareWebClient())
{
        client.DownloadProgressChanged += WebClientDownloadProgressChanged;
   client.DownloadFileCompleted += new AsyncCompletedEventHandler(Client_DownloadFileCompleted);      
  client.DownloadFileAsync(url, fileName);
 }

static void WebClientDownloadProgressChanged(object sender, 
DownloadProgressChangedEventArgs e)
    {
        Console.WriteLine("Download status: {0}%.", e.ProgressPercentage);
        Console.WriteLine(e.BytesReceived.ToString());

    }

    static void Client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
    {
        Console.WriteLine("Download finished!");
    }       

}

public class CookieAwareWebClient : WebClient
{
    private readonly CookieContainer m_container = new CookieContainer();

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        HttpWebRequest webRequest = request as HttpWebRequest;
        if (webRequest != null)
        {
            webRequest.CookieContainer = m_container;
        }
        return request;
    }
}

1 Ответ

0 голосов
/ 19 февраля 2019

Для возобновления загрузки вы можете установить соединение еще раз и указать смещение загружаемых данных.Кроме того, вы также можете запросить часть данных для загрузки.

  // establishing the connection
  HttpWebRequest oHttpWebRequest = (HttpWebRequest) WebRequest.Create ("myHttpAddress");

  #if partialDownload

  // reading the range 1000-2000 of the data
  oHttpWebRequest.AddRange (1000, 2000);
  // creating the file
  FileInfo oFileInfo = new FileInfo ("myFilename");
  FileStream oFileStream = oFileInfo.Create ();

  #else

  // reading after the last received byte
  FileInfo oFileInfo = new FileInfo ("myFilename");
  oHttpWebRequest.AddRange (oFileInfo.Length);
  // opening the file for appending the data
  FileStream oFileStream = File.Open (oFileInfo.FullName, FileMode.Append);

  #endif

  // opening the connection
  HttpWebResponse oHttpWebResponse = (HttpWebResponse) oHttpWebRequest.GetResponse ();
  Stream oReceiveStream = oHttpWebResponse.GetResponseStream ();

  // reading the HTML stream and writing into the file
  byte [] abBuffer = new byte [1000000];
  int iReceived = oReceiveStream.Read (abBuffer, 0, abBuffer.Length);
  while ( iReceived > 0 )
  { 
    oFileStream.Write (abBuffer, 0, iReceived);
    iReceived = oReceiveStream.Read (abBuffer, 0, abBuffer.Length);
  };
  // closing and disposing the resources
  oFileStream     .Close   ();
  oFileStream     .Dispose ();
  oReceiveStream  .Close   ();
  oReceiveStream  .Dispose ();
  oHttpWebResponse.Close   ();
  oHttpWebResponse.Dispose ();

Для отладки вы можете просмотреть полученные данные, заглянув в возвращенный заголовок веб-запроса.Для частичной загрузки вы можете получить, например,

Content-Range: bytes 1000-2000/1156774
Content-Length: 1001

Ключи заголовка можно получить из

oHttpWebResponse.Headers.Keys []

, а значения из

oHttpWebResponse.Headers []
...