我正在使用MultiThreadedDownloader。程序使用不同的部分内容下载内容。
使用低速连接时,其中一些部分请求有时会突然停止获取数据,即使下载了所有部分,它们也无法取得进展。我无法理解这个问题的原因。
获取回复的代码
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
| SecurityProtocolType.Tls11
| SecurityProtocolType.Tls12
| SecurityProtocolType.Ssl3;
ServicePointManager.Expect100Continue = true;
HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;
req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
req.AllowAutoRedirect = true;
req.ServicePoint.ConnectionLimit = 100;
req.ServicePoint.Expect100Continue = true;
req.UseDefaultCredentials = true;
req.KeepAlive = false;
req.Timeout = 5000;
req.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.GZip;
req.ProtocolVersion = HttpVersion.Version10;
HttpWebResponse resp = req.GetResponse() as HttpWebResponse;
Stream tempStream = resp.GetResponseStream();
while ((bytesRead = tempStream.Read(buffer, 0, buffer.Length)) > 0)
{
file.Write(buffer, 0, bytesRead);
totalBytesRead += bytesRead;
}
file.Close();
resp.Close();
tempStream.Close();
req.Abort();
响应不会引发异常。下载稍微进步后,部分下载停止了进展。其中一些是成功下载的,其中一些不是。
问题图片
如您所见,下载进度基本完成。但由于下载问题,它不能100%。下面进度条上的白色部分就是我所说的。
这个问题可能是什么原因?
更新
我已经发现问题只是连接速度低。可以同时下载多个连接,这使得每个部分下载的连接速度更低。
HttpWebResponse.GetResponseStream
方法无法从源获取足够的字节并等待该代码行。有时Stream.Read
会引发UnexpectedEndOfStream
错误,有时bytesRead
会返回 0 ,即使它不应该是。
那么我该如何解决这个问题呢?