Pergunta

Eu estou fazendo um programa que se conecta a um site e download do XML a partir dele. Em seguida, exibe as informações para o usuário.

O problema que estou tendo é quando eu abrir o programa e começar a baixar as informações XML leva um tempo muito longo. Quando eu carregar outra página do site com o programa ainda em aberto, leva cerca de meio segundo para download. Eu queria saber se havia alguma maneira de evitar isso.

Eu uso atualmente um HttpWebRequest para baixar o riacho e um StreamReader para ler. Então eu passar e analisar o XML usando XLinq.

Foi útil?

Solução

tente definir explicitamente o proxy. Se você não tem um proxy definido, a classe HttpRequest vai gastar tempo à procura de um. Uma vez que ele tem (ou não tem) encontrou um, ele vai usar essa informação para a vida do aplicativo, acelerando os pedidos subsequentes.

//internally sets "ProxySet" to true, so won't search for a proxy
request.Proxy = null;

Você também pode definir isso no .config:

<system.net>
  <defaultProxy
    enabled="false"
    useDefaultCredentials="false" >
    <proxy/>
    <bypasslist/>
    <module/>
  </defaultProxy>
</system.net>

Outras dicas

O primeiro tempo de atraso pode ser devido a uma combinação do seguinte:

  1. Tempo para resolver a entrada DNS do servidor
  2. tempo para baixar o proxy autoconfig roteiro, compilação e executá-lo para determinar a procuração eficaz
  3. latência de rede de seu aplicativo para o servidor proxy (se houver um servidor proxy no seu ambiente)
  4. latência de rede de o servidor proxy para o real destino do servidor.
  5. A latência em o servidor para servir o XML documento. Se tiver que atravessar um in-memory representação de objeto e gerar o documento XML, que pode levar algum tempo. Além disso, se for usando técnicas como XML-serialização para gerar o documento, em seguida, dependendo de como o seriador está configurado, o primeiro chamar para serializar / desserializar sempre leva muito tempo, devido ao fato que um conjunto intermédio precisa a serem gerados e compilados.
  6. Analisando o XML no lado do cliente Pode levar tempo, esp se o XML estrutura do documento é muito complexa.
  7. Se XLinq (como o XMLSerializer) gera conjunto temporário para o XML análise e consulta, em seguida, o primeiro pedido vai demorar mais tempo do que o seguintes.

Para descobrir qual parte é a tomada de tempo, inserir algum registro de tempo em seu código usando System.Diagnostics.Stopwatch ():

// this is the time to get the XML doc from the server, including the time to resolve DNS, get proxy etc.
System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
timer.Start();
HttpWebResponse resp = (HttpWebResponse)request.GetResponse();
timer.Stop();
Console.WriteLine("XML download took: " + timer.ElapsedMilliseconds);

timer.Start();
// now, do your XLinq stuff here...
timer.Stop();
Console.WriteLine("XLinq took: " + timer.ElapsedMilliseconds);

Você pode inserir um loop em torno deste, e ver o que a diferença para os vários componentes entre o primeiro pedido e os pedidos subsequentes é.

Se você achar que a diferença está no download, e não a consulta, em seguida, você pode investigar mais, obtendo uma rede fungada usando Wireshark.

Espero que isso ajude.

Você provavelmente teria de fazer mais algumas pesquisas para descobrir o que parte do pedido está levando mais tempo na primeira passagem. Meu primeiro instinto diz que o pedido DNS para obter o endereço IP para o nome de domínio que você especificar está levando mais tempo, porque ele não está em cache a primeira vez que é executado. Também poderia ser o servidor web do outro lado que tem de executar alguns scripts de inicialização na primeira vez que consultá-lo. Você mencionou que o primeiro pedido leva um longo tempo, mas você não diz quanto tempo. É este causando um grande problema que leva tanto tempo para fazer o primeiro pedido, ou é apenas um aborrecimento?

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