在winrt下载文件,使用HttpClient或HttpWebRequest或BackgroundDownloader?

时间:2012-02-26 09:57:06

标签: .net windows-8 microsoft-metro windows-runtime

我想通过使用HttpClient或HttpWebRequest或BackgroundDownloader来下载文件。

在发送请求之前,我需要修改http标题“Range”和“Cookie”,我想获取下载进度值

现在的问题是HttpClient可以修改“Range”标题但无法获得下载进度。 HttpWebRequest可以获得下载进度但无法修改“Range”标头。 BackgroundDownloader无法修改“Cookie”标头。这是一个链接"How to set cookie on BackgroundDownloader

我该怎么办?

3 个答案:

答案 0 :(得分:2)

我偶然发现了这个问题。使用HttpClient,您可以获得下载进度(假设服务器发送内容长度标头)。以下示例将返回的内容读取到(文件)流中,并在下载时计算进度。一件重要的事情是,您可以通过HttpCompletionOption.ResponseHeadersRead在任何内容可用且已发送标题时立即获得响应。

Uri uri = ...

// Request the data 
HttpResponseMessage responseMessage = await httpClient.GetAsync(uri,
   HttpCompletionOption.ResponseHeadersRead, cancellationToken);

// Get the size of the content
long? contentLength = responseMessage.Content.Headers.ContentLength;

// Create a stream for the destination file
StorageFile destinationFile = await destinationFolder
   .CreateFileAsync(destinationFileName,
   CreationCollisionOption.ReplaceExisting);
using (Stream fileStream =
   await destinationFile.OpenStreamForWriteAsync())
{
   // Read the content into the file stream
   int totalNumberOfBytesRead = 0;
   using (var responseStream =
      await responseMessage.Content.ReadAsStreamAsync())
   {
      int numberOfReadBytes;
      do
      {
         // Read a data block into the buffer
         const int bufferSize = 1048576; // 1MB
         byte[] responseBuffer = new byte[bufferSize];
         numberOfReadBytes = await responseStream.ReadAsync(
            responseBuffer, 0, responseBuffer.Length);
         totalNumberOfBytesRead += numberOfReadBytes;

         // Write the data block into the file stream
         fileStream.Write(responseBuffer, 0, numberOfReadBytes);

         // Calculate the progress
         if (contentLength.HasValue)
         {
            // Calculate the progress
            double progressPercent = (totalNumberOfBytesRead /
                (double)contentLength) * 100;

            // Display the progress     
             ...
         }
         else
         {
           // Just display the read bytes   
            ...
         }
      } while (numberOfReadBytes != 0);
   }
}

答案 1 :(得分:0)

在WinRT下,您可以在OperationContextScope的帮助下修改消息标题。我不确定它是否适用于HttpClient,但是HttpWebRequest确实如此!有关示例,请参阅msdn article

答案 2 :(得分:0)

我在我的库中实现了非常简单的HTTP类。这些类支持设置cookie,标题以及用于进度报告的IProgress(以及更多)。

查看此网站上的示例代码:https://mytoolkit.codeplex.com/wikipage?title=Http