0

我正在尝试从互联网上下载一堆 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

(即“下载”方法)

我不确定我做错了什么或者它是否正常 - 网络服务器没有发送 Content-Length 标头。在这种情况下,我们如何锻炼进度?

谢谢,

4

3 回答 3

1

如果 Web 服务器不发送内容长度,则无法知道还有多少数据,因此基本上不可能知道您通过它有多远。

哎呀,服务器可能正在动态生成数据,但仍然不知道(当您获得数据的第一部分时)它还需要发送多少数据。

任何声称显示进度(作为完整下载大小的比例)的东西要么是在撒谎,要么是以不同的方式下载数据,这确实给了它们完整的大小。当然,如果您正在下载多个文件,您可以随时说出您已完成下载的文件数量以及还需要下载的文件数量(尽管即使在这种情况下,如果您正在下载,后一个数字也可能不知道)爬虫式应用程序)。

请注意,一种常见的方法是显示一个进度条,指示“我正在取得进展”,但不会尝试猜测还有多少要下载。

于 2009-06-07T07:36:40.517 回答
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 应用程序中使用它,请确保从事件处理程序调用InvokeRequired / Invoke模式,因为它们不在 UI 线程上执行。

于 2009-06-07T07:48:39.527 回答
0

链接文章中的 Download() 方法中的代码依赖于类中的私有成员,所以虽然

WebRequest.Create("http://www.stackoverflow.com");

可能会编译,它实际上是调用WebRequest 的一个方法,然后丢弃结果,这是实际存储请求的位置。到时候线

WebRequest.GetResponse();

被调用时,代码已经忘记了来自 Create() 的所有响应。(C# 区分大小写,因此 WebRequest 和 webRequest 不是一回事;将名称 webRequest 赋予 WebRequest 类的实例是非常传统的做法。)

所以试着把线条

私有 HttpWebRequest 网络请求;
私有 HttpWebResponse webResponse;

在类顶部的方法之外作为 WebRequest 和 WebResponse 对象的实例。

于 2009-06-07T07:30:51.887 回答