Question

Je crée un programme qui se connecte à un site Web et télécharge du XML à partir de celui-ci. Il affiche ensuite les informations à l'utilisateur.

Le problème que je rencontre est la première fois que j’ouvre le programme et commence à télécharger les informations XML, c’est très long. Lorsque je charge une autre page du site avec le programme toujours ouvert, le téléchargement prend environ une demi-seconde. Je me demandais s’il existait un moyen d’éviter cela.

J'utilise actuellement HttpWebRequest pour télécharger le flux et un StreamReader pour le lire. Ensuite, je passe et analyse le code XML à l’aide de XLINQ.

Était-ce utile?

La solution

Essayez de définir explicitement le proxy. Si vous n'avez pas défini de proxy, la classe HttpRequest passera du temps à en rechercher un. Une fois qu'il en a (ou n'a pas) trouvé un, il utilisera ces informations tout au long de la vie de l'application, ce qui accélérera les demandes ultérieures.

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

Vous pouvez également définir ceci dans le .config:

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

Autres conseils

Le premier délai peut être dû à la combinaison des éléments suivants:

  1. Temps de résolution de l'entrée DNS du serveur
  2. Il est temps de télécharger le proxy script autoconfig, compiler et l'exécuter pour déterminer la proxy effectif
  3. latence du réseau de votre application vers le serveur proxy (s'il existe un serveur proxy dans votre environnement)
  4. latence du réseau à partir de le serveur proxy à la réelle serveur de destination.
  5. La latence sur le serveur pour servir le XML document. S'il doit traverser une représentation d'objet en mémoire et générer le document XML, qui pourrait prendre du temps. Aussi, si c'est en utilisant des techniques comme XML-Serialization pour générer le document, puis en fonction de la façon dont le le sérialiseur est configuré, le premier appel pour sérialiser / désérialiser toujours prend beaucoup de temps, en raison du fait qu'un assemblage intermédiaire a besoin à générer et à compiler.
  6. Analyse du code XML côté client pourrait prendre du temps, surtout si le XML la structure du document est très complexe.
  7. Si XLinq (comme XMLSerializer) génère un assemblage temporaire pour le XML l'analyse syntaxique & amp; interroger, puis le premier demande prendra plus de temps que le les suivantes.

Pour déterminer quelle partie prend du temps, insérez du temps de connexion dans votre code à l'aide de 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);

Vous pouvez insérer une boucle autour de cela et voir quelle est la différence entre les différents composants entre la première requête et les requêtes suivantes.

Si vous trouvez que la différence réside dans le téléchargement, et non dans l'interrogation, vous pouvez alors approfondir votre recherche en obtenant un renifleur réseau à l'aide de Wireshark .

J'espère que cela vous aidera.

Vous devrez probablement effectuer des recherches supplémentaires pour déterminer quelle partie de la demande prend plus de temps lors du premier passage. Mon premier instinct me dit que la requête DNS pour obtenir l'adresse IP du nom de domaine que vous spécifiez prend plus de temps, car elle n'est pas mise en cache lors de sa première exécution. Il peut également s'agir du serveur Web à l'autre extrémité qui doit exécuter des scripts de démarrage la première fois que vous l'interrogez. Vous avez mentionné que la première demande prend beaucoup de temps, mais vous ne dites pas combien de temps. Est-ce que cela cause un gros problème, il faut si longtemps pour faire la première demande, ou est-ce juste une gêne?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top