我正在尝试从互联网上下载一堆HTML文件并使用HttpWebRequest来完成它。
但是当我使用
时WebRequest.Create( “http://www.stackoverflow.com/”); WebRequest.GetResponse();
HttpWebResponse.ContentLength始终为-1。我必须显示这些页面下载的进度,在我们现有的VB6版本中,我们正在使用inet控件,它可以很好地报告进度。
我的代码非常相似:
http://www.geekpedia.com/tutorial179_Creating-a-download-manager-in-Csharp.html
('下载'方法)
我不确定我做错了什么或者它是否正常 - 没有Web服务器发送的Content-Length标头。在这种情况下我们如何锻炼进展?
谢谢,
答案 0 :(得分:1)
如果网络服务器没有发送内容长度,则无法知道有多少数据,所以基本上不可能知道你有多远。
哎呀,服务器可能是动态生成数据而仍不知道(当你得到数据的第一部分时)它还要发送多少数据。
声明显示进度的任何内容(占完整下载大小的比例)要么是谎言,要么是以不同的方式下载数据 给予他们全尺寸。当然,如果您正在下载多个文件,您可以随时说出已完成下载的文件数量以及您仍需下载的文件数量(尽管即使在这种情况下,如果您正在进行操作,也可能无法知道后一个数字一个履带式应用程序)。
请注意,一种常见方法是显示一个进度条,指示“我正在取得进展”但不会尝试猜测还有多少下载。
答案 1 :(得分:1)
以下是您可以尝试使用WebClient的示例:
class Program
{
static void Main(string[] args)
{
var client = new WebClient();
client.DownloadProgressChanged += (sender, e) =>
{
Console.WriteLine("{0}% completed", e.ProgressPercentage);
};
client.DownloadStringCompleted += (sender, e) =>
{
// e.Result contains downloaded string
Console.WriteLine("finished downloading...");
};
client.DownloadStringAsync(new Uri("http://www.stackoverflow.com"));
Console.ReadKey();
}
}
如果您决定在WinForms应用程序中使用它,请确保从事件处理程序调用{{3}} / InvokeRequired模式,因为它们未在UI线程上执行。
答案 2 :(得分:0)
链接文章中Download()方法中的代码依赖于类中的私有成员,所以尽管
WebRequest.Create("http://www.stackoverflow.com");
可能会编译,它实际上是在类 WebRequest上调用一个方法,然后丢弃结果,这是实际存储请求的地方。到行时
WebRequest.GetResponse();调用
,代码忘记了Create()的响应。 (C#区分大小写,因此WebRequest和webRequest不是一回事;将webRequest名称赋予WebRequest类的实例是非常常见的。)
所以尝试放行
private HttpWebRequest webRequest; private HttpWebResponse webResponse;
在类顶部的方法之外作为WebRequest和WebResponse对象的实例。