Domanda

Sto realizzando un programma che si collega a un sito Web e scarica XML da esso. Quindi visualizza le informazioni all'utente.

Il problema che sto riscontrando è quando apro il programma per la prima volta e inizio a scaricare le informazioni XML, ci vuole molto tempo. Quando carico un'altra pagina dal sito con il programma ancora aperto, ci vuole circa mezzo secondo per il download. Mi chiedevo se ci fosse un modo per evitarlo.

Attualmente uso un HttpWebRequest per scaricare lo stream e uno StreamReader per leggerlo. Quindi analizzo e analizzo l'XML usando XLINQ.

È stato utile?

Soluzione

Prova a impostare esplicitamente il proxy. Se non hai un proxy definito, la classe HttpRequest impiegherà del tempo a cercarne uno. Una volta che ne ha trovato (o non trovato), utilizzerà tali informazioni per la durata dell'applicazione, accelerando le richieste successive.

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

Puoi anche definirlo in .config:

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

Altri suggerimenti

Il primo ritardo può essere dovuto a una combinazione di quanto segue:

  1. Tempo per risolvere la voce DNS del server
  2. Tempo per scaricare il proxy script autoconfig, compilare e eseguirlo per determinare il proxy effettivo
  3. latenza di rete dalla tua app al server proxy (se nel tuo ambiente è presente un server proxy)
  4. latenza di rete da il server proxy all'attuale server di destinazione.
  5. La latenza è attiva il server per servire l'XML documento. Se deve attraversare un rappresentazione di oggetti in memoria e generare il documento XML, quello potrebbe richiedere del tempo. Inoltre, se lo è usando tecniche come Serializzazione XML per generare il file documento, quindi a seconda di come il serializzatore è configurato, il primo chiamare per serializzare / deserializzare sempre richiede molto tempo, a causa del fatto di cui necessita un assemblaggio intermedio da generare e compilare.
  6. Analisi dell'XML sul lato client potrebbe richiedere del tempo, specialmente se l'XML la struttura del documento è molto complessa.
  7. Se XLinq (come XMLSerializer) genera un assembly temporaneo per XML analisi & amp; interrogazione, quindi il primo la richiesta richiederà più tempo del quelli successivi.

Per capire quale parte richiede tempo, inserisci un po 'di tempo nel tuo codice 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);

È possibile inserire un ciclo attorno a questo e vedere qual è la differenza tra i vari componenti tra la prima richiesta e le richieste successive.

Se trovi che la differenza sta nel download, e non nell'interrogazione, allora puoi approfondire ulteriormente facendo uno sniff della rete usando Wireshark .

Spero che questo aiuti.

Probabilmente dovresti fare qualche ricerca in più per capire quale parte della richiesta impiega più tempo al primo passaggio. Il mio primo istinto afferma che la richiesta DNS per ottenere l'indirizzo IP per il nome di dominio specificato richiede più tempo, poiché non viene memorizzata nella cache la prima volta che viene eseguita. Potrebbe anche essere il server Web dall'altra parte che deve eseguire alcuni script di avvio la prima volta che lo interroghi. Hai detto che la prima richiesta richiede molto tempo, ma non dici quanto tempo. Questo sta causando un grosso problema che impiega così tanto tempo a fare la prima richiesta, o è solo un fastidio?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top