如何有效地设置HttpWebRequest下载的字节数?

时间:2016-04-18 04:16:19

标签: c# .net httpwebrequest

我目前正在处理文件下载程序项目。该应用程序旨在支持可恢复的下载。每次调用ReadBytes时,所有下载的数据及其元数据(下载范围)都会立即存储在磁盘上。我们假设我使用了以下代码段: -

var reader = new BinaryReader(response.GetResponseStream());
var buffr = reader.ReadBytes(_speedBuffer);
DownloadSpeed += buffr.Length;//used for reporting speed and zeroed every second

这里_speedBuffer是要下载的字节数,它被设置为默认值。

我已经通过两种方法测试了应用程序。首先是下载托管在本地IIS服务器上的文件。速度很快。其次,我试图从互联网上下载相同文件的副本(从实际下载的地方)。我的净速度真的很慢。现在,我观察到如果我增加_speedBuffer然后从本地服务器下载速度是好的,但对于互联网副本,速度报告很慢。然而,如果我减小_speedBuffer的值,则文件的互联网副本的下载速度(报告)是好的,但不适用于本地服务器。所以我想,为什么我不应该在运行时更改_speedBuffer。但是我提出的所有自定义算法(用于更改值)都是无效的。意味着与其他下载程序相比,下载速度仍然很慢。

这种方法可以吗?

我做错了吗?

我应该坚持_speedBuffer(字节数)的默认值吗?

1 个答案:

答案 0 :(得分:0)

在这种情况下ReadBytes的问题是它尝试读取完全该字节数,或者在没有更多数据要读取时返回。

因此,您收到一个包含99个字节数据的数据包,然后调用ReadBytes(100)将等待下一个数据包包含该丢失的字节。

我根本不会使用BinaryReader

byte[] buffer = new byte[bufferSize];
using (Stream responseStream = response.GetResponseStream())
{
    int bytes;
    while ((bytes = responseStream.Read(buffer, 0, buffer.Length)) > 0)
    {
        DownloadSpeed += bytes;//used for reporting speed and zeroed every second
        // on each iteration, "bytes" bytes of the buffer have been filled, store these to disk
    }

    // bytes was 0: end of stream
}