Accueil > Général > [CHALLENGE #1] Requêtes successives avec System.Net.WebClient

[CHALLENGE #1] Requêtes successives avec System.Net.WebClient

J’ai envie de faire travailler un peu les méninges de ceux que ça intéresse et de vous fournir une occasion d’étudier le fonctionnement interne de la classe System.Net.WebClient.

Alors premièrement créez un projet Winform avec une fenêtre contenant simplement un bouton.

Le code behind du bouton est le suivant:

string CheminSauvegardeDesImages = @"CHEMINIMAGES";
 
WebClient wc,wc2;
 
const string urlPage = "http://www.google.fr/";
const string urllogo = "http://www.google.fr/images/logos/ps_logo2.png";
 
wc = new WebClient();
wc.UseDefaultCredentials = true;
 
Stream sresponse = wc.OpenRead(urlPage);
 
wc2 = new WebClient();
wc2.UseDefaultCredentials = true;
Stream s = wc2.OpenRead(urllogo);
Image image = System.Drawing.Image.FromStream(s);
image.Save(CheminSauvegardeDesImages + @"\" + DateTime.Now.Ticks.ToString() + ".tiff", System.Drawing.Imaging.ImageFormat.Tiff);

(Remplacez bien sûr CHEMINIMAGES par un chemin valide chez vous…)

Ce code simple utilise la classe WebClient pour aller récupérer le html de la page d’acceuil de google ainsi que le logo. On ne fait rien du code html dans cet exemple mais on pourrait imaginer un traitement dessus.

Cliquez une première fois sur le bouton et tout se passe bien, l’image se sauvegarde.
Cliquez une deuxième fois et là….Crash. La requête de récupération de l’image tombe en timeout systématiquement.

Est-ce que quelqu’un voit une explication?
Attention ne me sortez pas un truc évident du genre les Stream ne sont pas fermés c’est un peu plus compliqué que ça.
Fermer les flux corrige le problème mais on pourrait très bien imaginer avoir besoin de les laisser ouverts pour telle ou telle raison.
(c’est le premier challenge je suis gentil je vous donne pleins d’indices)

Si vous avez la réponse expliquez la dans les commentaires de l’article.
La solution dans une semaine!

Enjoy…

Étiquettes : ,
  1. 26/11/2010 à 8:57

    hihi, heu ^^
    Je dirais au hasard que peut-être la connexion tcp ip reste ouverte et on ne peut pas en ouvrir 2 dans le même thread?

    • 26/11/2010 à 9:01

      Il faut certainement chercher dans cette direction mais ce sont bien 2 objets WebClient différents qui sont utilisés et en plus ils sont réinstanciés au 2ème appel🙂

  2. 29/11/2010 à 8:14

    Les stream n’étant pas fermés, il y a 2 connexions d’ouvertes sur http://www.google.fr. Le machine.config définit apparemment par défaut un max de connexion à 2.
    En ajoutant ceci règle le problème.
    C’est le genre de truc où on peut chercher longtemps quand on est en pleine bourre sur les projets🙂 mais bon, en général on ferme les streams quand même

  3. 29/11/2010 à 8:16

    bon le code xml n’est pas passé. Je disais d’ajouter un maxconnection=10 sur le site google dans la section system.net, connectionManagement. C’est plus verbeux que du xml désolé. Et salut à toi Christophe!

  4. 30/11/2010 à 2:10

    Salut Benoît! Comment ça va depuis le temps?
    Oui c’est effectivement la bonne réponse.
    On a justement eu le cas où pas mal de choses se passaient en parallèle et ou on ne pouvait pas être sûrs que les streams étaient fermés à un moment donné. Donc des connections qui tombent en timeout aléatoirement… Moralité fermez vos connexions dès que vous pouvez!

  1. No trackbacks yet.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :