Pergunta

Estou tentando obter um monte de arquivos HTML baixados da Internet e usando o httpwebrequest para fazê -lo.

No entanto, quando eu uso

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

O httpwebroponse.contentlength é sempre -1. Eu tenho que mostrar o progresso dessas páginas downloads, em nossa versão VB6 existente, estamos usando o controle INET e relata o progresso muito bem.

Meu código é muito parecido com isso:

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

(O método 'download' que é)

Não tenho certeza do que estou fazendo de errado ou se é normal-não há cabeçalho de comprimento de conteúdo enviado pelo servidor da Web. Como praticamos o progresso neste caso?

Obrigado,

Foi útil?

Solução

Aqui está uma amostra usando Cliente da web você poderia tentar:

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();
    }
}

Se você decidir usá -lo em um aplicativo Winforms, certifique -se de ligar Invocou/Invocar padrão dos manipuladores de eventos, pois não são executados no thread da interface do usuário.

Outras dicas

Se o servidor da Web não enviar um comprimento de conteúdo, não há como saber quanto mais dados existem, por isso é basicamente impossível saber o quão longe você está.

Caramba, o servidor pode estar gerando dados dinamicamente e ainda Não sei (quando você obtém a primeira parte dos dados) quanto mais dados precisam enviar.

Qualquer coisa que reivindicações Estar mostrando progresso (como uma proporção de tamanho completo de download) está mentindo ou está baixando os dados de uma maneira diferente que faz Dê a eles o tamanho completo. Obviamente, se você está baixando vários arquivos, sempre pode dizer quantos arquivos terminou de baixar e quantos você ainda precisa baixar (embora mesmo neste caso o último número possa não ser conhecido se você estiver fazendo um aplicativo de estilo rastreador).

Observe que uma abordagem comum é mostrar uma barra de progresso que indica "estou progredindo", mas não tenta adivinhar quanto resta para baixar.

O código no método Download () no artigo vinculado depende dos membros privados da classe, por isso, embora

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

pode compilar, está realmente chamando um método no classe WebRequest, descartando o resultado, que é onde a solicitação é realmente armazenada. Quando a linha

WebRequest.GetResponse();

é chamado, o código esqueceu tudo sobre a resposta de Create (). (C# é sensível ao minúsculo, portanto, WebRequest e WebRequest não são a mesma coisa; e é bastante convencional dar o nome WebRequest a uma instância da classe WebRequest.)

Então tente colocar as linhas

private HttpWebRequest webRequest;
private HttpWebResponse webResponse;

Fora do método no topo da classe como instâncias dos objetos WebRequest e WebSponse.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top