我想通过使用HttpClient或HttpWebRequest或BackgroundDownloader来下载文件。
在发送请求之前,我需要修改http标题“Range”和“Cookie”,我想获取下载进度值
现在的问题是HttpClient可以修改“Range”标题但无法获得下载进度。 HttpWebRequest可以获得下载进度但无法修改“Range”标头。 BackgroundDownloader无法修改“Cookie”标头。这是一个链接"How to set cookie on BackgroundDownloader
我该怎么办?
答案 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