Использование httpwebrequest для загрузки HTML -страниц возвращает ContentLength As -1

StackOverflow https://stackoverflow.com/questions/961383

Вопрос

Я пытаюсь загрузить кучу HTML -файлов, загруженных из Интернета, и используя HttpwebRequest для этого.

Однако, когда я использую

Webrequest.create ("http://www.stackoverflow.com/"); WebRequest.getResponse ();

Httpwebresponse.contentlength всегда -1. Я должен показать прогресс этих страниц загрузки, в нашей существующей версии VB6 мы используем INET Control, и он отлично сообщает о прогрессе.

Мой код очень похож на это:

http://www.geekpedia.com/tutorial179_creating-a-download-manager-in-csharp.html

(Метод «скачать», который есть)

Я не уверен, что я делаю неправильно или это нормально-нет никакого заголовка длины контента, отправленного веб-сервером. Как мы тренируем прогресс в этом случае?

Спасибо,

Это было полезно?

Решение

Вот образец с использованием 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, убедитесь, что вы звоните InvokeRequed/Вызвать шаблон от обработчиков событий, поскольку они не выполняются в потоке пользовательского интерфейса.

Другие советы

Если веб -сервер не отправляет длину контента, нет никакого способа узнать, насколько больше данных есть, поэтому в основном невозможно узнать, насколько вы его.

Черт, сервер может динамически генерировать данные и Все еще Не знаю (когда вы получите первую часть данных), сколько еще данных он должен отправить.

Все, что претензии Чтобы показать прогресс (как доля полного размера загрузки) либо лжет, либо загружает данные по -другому, который делает Дайте им полный размер. Конечно, если вы загружаете несколько файлов, вы всегда можете сказать, сколько файлов вы закончили загружать и сколько вам еще нужно скачать (хотя даже в этом случае последний номер может не известен, если вы делаете приложение в стиле гусеницы).

Обратите внимание, что один общий подход состоит в том, чтобы показать строку прогресса, которая указывает на «Я делаю прогресс», но не пытается угадать, сколько остается загрузить.

Код в методе загрузки () в связанной статье зависит от частных участников в классе, поэтому, хотя

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

может собрать, это фактически вызывает метод на учебный класс WebRequest, затем отбрасывая результат, где запрос фактически хранится. К тому времени, когда линия

WebRequest.GetResponse();

называется, код забыл все о ответе от create (). (C# - это чувствителен к случаям, поэтому WebRequest и WebRequest - это не одно и то же; и довольно общепринято дать имя WebRequest экземпляру класса WebRequest.)

Так что попробуйте поставить линии

private HttpWebRequest webRequest;
private HttpWebResponse webResponse;

вне метода в верхней части класса в качестве экземпляров объектов WebRequest и WebResponse.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top