Iha*_*nik 1 .net c# download stream httpwebresponse
我正在写web下载器并遇到了这个奇怪的问题.示例代码:
int chunk;
var request = WebRequest.Create(uri) as HttpWebRequest;
using (WebResponse response = request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
using (Stream file = File.Create(filePath))
{
long byteReaded = 0;
long contentLength = response.ContentLength;
while (byteReaded < contentLength)
{
long bytesCountToRead = contentLength - byteReaded > chunk ? chunk : contentLength - byteReaded;
byte[] buffer = new byte[bytesCountToRead];
responseStream.Read(buffer, 0, buffer.Length);
file.Write(buffer, 0, buffer.Length);
byteReaded += bytesCountToRead;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题:当'chunk'变量== 1或2个字节时,它没问题.但是当这个尺寸更大时 - 图像会受到干扰!我已经发现它具有下载速度(响应读取速度),因为当我设置较大的尺寸chunk并插入Thread.Sleep(time)最后一行while循环时,图像保持正常.希望有人可以帮助我.

这一点都不奇怪 - 你只是误用了溪流.您假设单个调用Read将读取您要求的整个缓冲区.情况并非如此 - 它可以轻松减少回报.你应该改变这个:
responseStream.Read(buffer, 0, buffer.Length);
file.Write(buffer, 0, buffer.Length);
byteReaded += bytesCountToRead;
Run Code Online (Sandbox Code Playgroud)
至:
int chunkRead = responseStream.Read(buffer, 0, buffer.Length);
file.Write(buffer, 0, chunkRead);
byteReaded += chunkRead;
Run Code Online (Sandbox Code Playgroud)
你永远不应该忽略它的返回值Stream.Read.
此外,无需在每次迭代时创建新的字节数组.
最后,如果你使用.NET 4,所有这一切都可以写很多简单的多:
using (var responseStream = response.GetResponseStream())
{
using (Stream file = File.Create(filePath))
{
responseStream.CopyTo(file);
}
}
Run Code Online (Sandbox Code Playgroud)
(或者只是使用WebClient/ HttpClient开头......)