2009-09-12 15 views
6

Sto creando un programma che si collega a un sito Web e scarica XML da esso. Quindi visualizza le informazioni all'utente.Molto tempo per caricare la prima connessione in C# .NET

Il problema che sto avendo è 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 stavo chiedendo se ci fosse un modo per evitarlo.

Attualmente utilizzo un HttpWebRequest per scaricare il flusso e uno StreamReader per leggerlo. Quindi analizzo e analizzo XML utilizzando XLINQ.

+1

Il ritardo è solo la prima volta che si colpisce il sito Web di pubblicazione XML, ovvero in caso di hit successivi recupera rapidamente l'XML? In tal caso potrebbe essere il ritardo iniziale di avvio dell'applicazione Web XML ... –

+0

Accade anche con il mio server di aggiornamento mentre sto verificando la disponibilità di aggiornamenti, ho anche provato a connettermi a http://google.com e ha fatto ancora la stessa cosa Stessi risultati con un WebClient anziché con HttpWebRequest. – Christian

+0

Oh e anche, una volta che mi collego a QUALSIASI server tutti gli altri server si caricano velocemente. – Christian

risposta

14

Provare a impostare esplicitamente il proxy. Se non si dispone di un proxy definito, la classe HttpRequest dedicherà tempo alla ricerca di uno. Una volta trovata (o non trovata), utilizzerà tali informazioni per tutta la durata dell'applicazione, accelerando le richieste successive.

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

È possibile anche definire questo nel config:

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

Sulla base di quello che ha detto finora, questo suona come la migliore spiegazione. Curioso di vedere cosa trova Christian. – JoshBerke

+4

Questo ha funzionato! Grazie mille :) – Christian

+1

@Rex M: Grazie mille per questo, questo problema mi stava facendo impazzire e finalmente sono stato risolto con questo tweak .. +1 .. –

0

Probabilmente dovresti fare qualche ricerca in più per capire quale parte della richiesta richiede più tempo al primo passaggio. Il mio primo istinto dice che la richiesta DNS per ottenere l'indirizzo IP per il nome di dominio specificato richiede più tempo, perché 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 si interroga. Hai detto che la prima richiesta richiede molto tempo, ma non dici quanto tempo. Questo sta causando un grosso problema che ci vuole così tanto tempo per fare la prima richiesta, o è solo un fastidio?

+0

Vedere i miei commenti sopra in risposta a Guy Starbuck. Per quanto riguarda il tempo, varia ma solitamente da 15 a 45 secondi. Non è un grosso problema, ma è un fastidio, soprattutto quando porto il programma a Windows Mobile. – Christian

+1

"da 15 a 45 secondi" non c'è praticamente alcun modo in cui una ricerca DNS richiede tanto tempo ogni volta che si avvia l'app. –

1

Il primo tempo di ritardo può essere dovuto ad una combinazione dei seguenti elementi:

  1. tempo per risolvere il DNS del server voce
  2. Tempo per scaricare il proxy script autoconfig, compilare e eseguirlo per determinare lo efficace delega
  3. rete latenza dalla tua app al server proxy (se v'è un server proxy nell'ambiente)
  4. rete latenza dal il server proxy per il server effettivo destinazione.
  5. La latenza su il server per servire il documento XML . Se deve attraversare una rappresentazione dell'oggetto in memoria e generare il documento XML, che potrebbe richiedere del tempo. Inoltre, se è usando tecniche come XML-serializzazione per generare il documento , poi a seconda di come il serializzatore è configurato, il primo chiamata a serializzare/deserializzare sempre richiede molto tempo, a causa del fatto che un assemblaggio intermedio necessita di da generare e compilare.
  6. L'analisi del codice XML sul lato client potrebbe richiedere tempo, specialmente se la struttura del documento XML è molto complessa.
  7. Se XLinq (come il XMLSerializer) genera il montaggio temporaneo per l'XML parsing & interrogazione, quindi la prima richiesta ci vorrà più tempo di quanto i quelle successive.

di capire quale parte sta prendendo tempo, inserire qualche tempo accedendo al proprio 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 intorno a questo, e vedere che cosa il la differenza per i vari componenti tra la prima richiesta e le richieste successive è.

Se si riscontra che la differenza è nel download, e non nell'interrogazione, è possibile esaminare ulteriormente ottenendo uno sniffing di rete utilizzando Wireshark.

Spero che questo aiuti.

Problemi correlati