2009-09-12 10 views
6

Ich mache ein Programm, das eine Verbindung zu einer Website herstellt und XML von ihm herunterlädt. Es zeigt dann die Informationen für den Benutzer an.Lange Zeit zum Laden der ersten Verbindung in C#. NET

Das Problem, das ich habe, ist, wenn ich das Programm zum ersten Mal öffne und die XML-Informationen herunterlade, dauert es sehr lange. Wenn ich eine andere Seite von der Site mit dem geöffneten Programm lade, dauert es ungefähr eine halbe Sekunde, um herunterzuladen. Ich habe mich gefragt, ob es irgendeinen Weg gibt, das zu vermeiden.

Ich verwende derzeit eine HttpWebRequest, um den Stream und einen StreamReader zu downloaden, um es zu lesen. Dann gehe ich durch und analysiere das XML mit XLINQ.

+1

Ist die Verzögerung nur beim ersten Mal auf der XML-Serving-Website - dh, bei nachfolgenden Treffern holt es die XML schnell zurück? Wenn dies der Fall ist, könnte es die Startverzögerung der XML-Serving-Webanwendung sein ... –

+0

Es passiert auch mit meinem Update-Server, während ich nach Updates suche. Ich habe auch versucht, mich einfach mit http://google.com zu verbinden machte immer noch das Gleiche. Gleiche Ergebnisse mit einem WebClient anstatt einer HttpWebRequest auch. – Christian

+0

Oh, und auch, sobald ich eine Verbindung zu jedem Server alle anderen Server schnell laden. – Christian

Antwort

14

Versuchen Sie explizit, den Proxy festzulegen. Wenn Sie keinen Proxy definiert haben, wird die Klasse HttpRequest nach einer Zeit suchen. Sobald es eines gefunden hat (oder nicht gefunden hat), wird es diese Informationen für die Lebensdauer der Anwendung verwenden und nachfolgende Anfragen beschleunigen.

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

Sie können dies auch in der .config definieren:

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

Basierend auf dem, was er bisher gesagt hat, klingt das nach der besten Erklärung. Neugierig zu sehen, was Christian findet. – JoshBerke

+4

Das hat funktioniert! Vielen Dank :) – Christian

+1

@Rex M: Vielen Dank dafür, diese Ausgabe hat mich verrückt gemacht und schließlich mit dieser Optimierung aussortiert .. +1 .. –

0

Sie müssten wahrscheinlich noch mehr recherchieren, um herauszufinden, welcher Teil der Anfrage beim ersten Durchlauf länger dauert. Mein erster Instinkt besagt, dass die DNS-Anforderung, die IP-Adresse für den von Ihnen angegebenen Domänennamen zu erhalten, länger dauert, da sie beim ersten Mal nicht zwischengespeichert wird. Es könnte auch der Webserver am anderen Ende sein, der beim ersten Abfragen einige Start-Skripts ausführen muss. Sie haben erwähnt, dass die erste Anfrage sehr lange dauert, aber Sie sagen nicht, wie lange. Ist das ein großes Problem, dass es so lange dauert, die erste Anfrage zu machen, oder ist es nur ein Ärgernis?

+0

Siehe meine Kommentare oben als Antwort auf Guy Starbuck. Wie lange dauert es, variiert aber normalerweise zwischen 15 und 45 Sekunden. Es ist kein großes Problem, aber es ist ein Ärgernis, besonders wenn ich das Programm auf Windows Mobile portiere. – Christian

+1

"15 bis 45 Sekunden" gibt es praktisch keine Möglichkeit, dass ein DNS-Lookup bei jedem Start der App so lange dauert. –

1

Die erste Zeitverzögerung aufgrund einer Kombination der folgenden sein kann:

  1. Zeit den Server DNS zu lösen Eintrag
  2. Zeit, um den Proxy Autokonfig-Skript herunterladen, kompilieren und ausführen, um die 012 zu bestimmeneffektive Proxy
  3. Netzwerk-Latenz von Ihrer App auf den Proxy-Server (wenn es ein Proxy-Server in Ihrer Umgebung)
  4. Netzwerk-Latenz von der Proxy-Server auf die tatsächlichen Zielserver.
  5. Die Latenz auf der Server das XML Dokument zu dienen. Wenn es eine In-Memory-Objektdarstellung durchlaufen muss und das XML-Dokument generiert, kann das einige Zeit dauern. Auch, wenn es unter Verwendung von Techniken wie XML-Serialisierung ist das Dokument zu erzeugen, dann je nachdem, wie die Serializer konfiguriert sind, der erste Aufruf zur Serialisierung/Deserialisierung immer dauert eine lange Zeit, aufgrund der Tatsache, dass Eine Zwischenbaugruppe muss generiert und kompiliert werden.
  6. Das Parsen der XML auf der Client-Seite könnte Zeit brauchen, vor allem wenn die XML-Dokumentstruktur sehr komplex ist.
  7. Wenn XLinq (wie die XMLSerializer) Temperaturbaugruppe für das Parsen von XML & anfragende erzeugt, dann wird die erste Anfrage mehr Zeit als die nachfolgenden bringen wird.

Um herauszufinden, welche Teilzeit nimmt, legen einige Zeit Code Anmeldung in Verwendung 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); 

Sie eine Schleife um diese einsetzen kann, und sehen, was die Unterschied für die verschiedenen Komponenten zwischen der ersten Anfrage und nachfolgenden Anfragen ist.

Wenn Sie feststellen, dass der Unterschied im Herunterladen und nicht in der Abfrage liegt, können Sie weiter untersuchen, indem Sie ein Netzwerk-Sniff mit Wireshark erhalten.

Hoffe, das hilft.

Verwandte Themen