使用HttpWebRequest下载html页面返回ContentLength为-1

时间:2009-06-07 07:12:20

标签: c# httpwebrequest httpwebresponse

我正在尝试从互联网上下载一堆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标头。在这种情况下我们如何锻炼进展?

谢谢,

3 个答案:

答案 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对象的实例。