Pergunta

Eu pedi 100 páginas que todos 404. Eu escrevi

    {
    var s = DateTime.Now;
    for(int i=0; i < 100;i++)
        DL.CheckExist("http://google.com/lol" + i.ToString() + ".jpg");
    var e = DateTime.Now;
    var d = e-s;
        d=d;
        Console.WriteLine(d);
    }

static public bool CheckExist(string url)
{
    HttpWebRequest wreq = null;
    HttpWebResponse wresp = null;
    bool ret = false;

    try
    {
        wreq = (HttpWebRequest)WebRequest.Create(url);
        wreq.KeepAlive = true;
        wreq.Method = "HEAD";
        wresp = (HttpWebResponse)wreq.GetResponse();
        ret = true;
    }
    catch (System.Net.WebException)
    {
    }
    finally
    {
        if (wresp != null)
            wresp.Close();
    }
    return ret;
}

Duas corridas mostrar que leva 00: 00: 30,7968750 e 00: 00: 26,8750 mil. Então eu tentei firefox e usar o código a seguir

<html>
<body>
<script type="text/javascript">
for(var i=0; i<100; i++)
    document.write("<img src=http://google.com/lol" + i + ".jpg><br>");
</script>

</body>
</html>

Usando meu tempo comp e contando que era cerca de 4 segundos. 4 segundos é 6.5-7.5faster em seguida, meu aplicativo. Eu pretendo fazer a varredura através de milhares de arquivos assim que tomar 3,75 horas em vez de 30 minutos seria um grande problema. Como posso fazer este código mais rápido? Eu sei que alguém vai dizer firefox armazena as imagens, mas eu quero dizer que 1) ele ainda precisa verificar os cabeçalhos do servidor remoto para ver se ele foi atualizado (que é o que eu quero meu aplicativo para fazer) 2) Eu não sou receber o corpo, o meu código só deve ser solicitando o cabeçalho. Então, como faço para resolver isso?

Foi útil?

Solução

Provavelmente Firefox emite vários pedidos ao mesmo tempo enquanto seu código faz-los um por um. Talvez tópicos acrescentando irá acelerar o seu programa.

Outras dicas

Eu observei que um trava HttpWebRequest na primeira solicitação. Fiz algumas pesquisas e que parece estar acontecendo é que o pedido é a configuração ou proxies de detecção automática. Se definir

request.Proxy = null;

no objeto solicitação da web, você pode ser capaz de evitar um atraso inicial.

Com auto-detectar proxy:

using (var response = (HttpWebResponse)request.GetResponse()) //6,956 ms
{
}

Sem auto-detectar proxy:

request.Proxy = null;
using (var response = (HttpWebResponse)request.GetResponse()) //154 ms
{
}

alterar seu código para getresponse assíncrona

public override WebResponse GetResponse() {
    •••
    IAsyncResult asyncResult = BeginGetResponse(null, null);
    •••
    return EndGetResponse(asyncResult);
}

Async Get

A resposta está mudando HttpWebRequest / HttpWebResponse para WebRequest / WebResponse única. Isso corrigiu o problema.

Você já tentou abrir o mesmo URL no IE na máquina que o seu código é implantado? Se for uma máquina Windows Server, em seguida, às vezes é porque o URL que você está pedindo não está na lista do IE (que HttpWebRequest funciona off) de sites seguros. Você só precisa adicioná-lo.

Você tem mais informações você pode postar? Eu tenho de fazer algo semelhante e ter executado em toneladas de problemas com HttpWebRequest antes. Todos único. Então mais informações ajudaria.

BTW, chamando-o usando os métodos assíncronos não vai realmente ajudar neste caso. Não encurtar o tempo de download. Ele só não bloquear o segmento de chamada é tudo.

close o fluxo de resposta quando você está feito, então em sua checkExist (), adicione wresp.Close () depois wresp = (HttpWebResponse) wreq.GetResponse ();

OK se você está recebendo o código de estado 404 para todas as páginas, então é devido a não especificação de credenciais. Então, você precisa adicionar

wreq.Credentials = CredentialCache.DefaultCredentials;

Em seguida, você também pode se deparar com código de status = 500 para que você precisa especificar User Agent. Que é algo como o abaixo da linha

wreq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0";

"instância A WebClient não envia opcionais cabeçalhos HTTP por padrão. Se o seu pedido requer um cabeçalho opcional, você deve adicionar o cabeçalho para a coleção cabeçalhos. Por exemplo, para manter consultas na resposta, você deve adicionar um user- agente de cabeçalho. Além disso, os servidores podem retornar 500 (Internal Server Error) se o cabeçalho agente do usuário é perdido ".

referência: https: //msdn.microsoft.com/en-us/library/system.net.webclient(v=vs.110).aspx

Para melhorar o desempenho do httpwebrequest você precisa adicionar

wreq.Proxy=null

Agora o código será parecido com:

 static public bool CheckExist(string url)
{
    HttpWebRequest wreq = null;
    HttpWebResponse wresp = null;
    bool ret = false;

try
{
    wreq = (HttpWebRequest)WebRequest.Create(url);
    wreq.Credentials = CredentialCache.DefaultCredentials;
    wreq.Proxy=null;
    wreq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0";
    wreq.KeepAlive = true;
    wreq.Method = "HEAD";
    wresp = (HttpWebResponse)wreq.GetResponse();
    ret = true;
}
catch (System.Net.WebException)
{
}
finally
{
    if (wresp != null)
        wresp.Close();
}
return ret;

}

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