IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Exécution de plusieurs requêtes HTTP à la suite [Débutant]


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 52
    Points : 48
    Points
    48
    Par défaut Exécution de plusieurs requêtes HTTP à la suite
    Bonjour,


    Je viens vous demander un peu d'aide car j'ai un problème qui me semble bizarre sur un de mes projets. Je dois faire un GET / , parser la page pour récupérer les images et faire un GET de chaque image pour les sauvegarder. Le problème c'est qu'après 3 GET mon application freeze complètement ..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    // je créé ma requête avec (HttpWebRequest)WebRequest.Create()
    HttpWebRequest myHttpWebRequest = HTTPMethod.makeRequest(url + "/");
     
    //j'exécute ma première requete sans soucis avec HttpWebRequest.GetReponse()
    HttpWebResponse myHttpWebResponse = HTTPMethod.getResponseSync(myHttpWebRequest,console);
     
    // je parse la réponse pour récupérer une list d'images à récupérer
    List<String> imgQueue = HTTPMethod.getObjectsToRequest(myHttpWebResponse);
     
     
     
    //puis je fais une boucle pour faire un get sur chacune des mes images :
    for(int i = 0; i < imgQueue.Count; i++){ 
         console.AppendText("\t\t " + url  + imgQueue[i] + "\n");
         myHttpWebRequest = HTTPMethod.makeRequest(url + imgQueue[i]);
         console.AppendText("\t\t requete créée  \n");
         console.ScrollToCaret();
         myHttpWebResponse = HTTPMethod.getResponseSync(myHttpWebRequest);
         console.AppendText("\t\t retour ok \n");
         console.ScrollToCaret();
         Thread.Sleep(5000);
    }

    Mes deux autres dans HTTPMethod que j'appelle pour créer et exécuter mes requêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
     
            internal static HttpWebRequest makeRequest(String url, Boolean pipelined = false, Boolean keepAlive = false, String method = "GET")
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://" + url);
                request.Method = method;
                request.KeepAlive = keepAlive;
                request.Pipelined = pipelined;
     
                return request;
            }
            internal static HttpWebResponse getResponseSync(HttpWebRequest request, System.Windows.Forms.RichTextBox console = null)
            {
                try
                {
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                    if (console != null)
                    {
                        console.AppendText("\tHTTP Request  Headers :\n " + request.Headers + "\n");
                        console.AppendText("\tHTTP Response Headers :\n" + response.Headers + "\n");
                        console.AppendText("\t'Pipelined' property is:" + request.Pipelined + "\n");
                        console.AppendText("\t'Keep-Alive' property is:" + request.KeepAlive + "\n");
                        console.ScrollToCaret();
                    }
                    return response;
                }
                catch (WebException e)
                {
                    console.AppendText("\tMain Exception raised!\n");
                    console.AppendText("\tMessage:" + e.Message+"\n");
                    console.AppendText("\tStatus:" + e.Status + "\n");
                }
                catch (Exception e)
                {
     
                    console.AppendText("\tMain Exception raised!\n");
                    console.AppendText("\tMessage:" + e.Message + "\n");
                    console.AppendText("\tSource:" + e.Source + "\n");
                }
     
                return null;
            }

    donc voilà, c'est un code plutôt simple, je ne vois pas pourquoi il ne fonctionne pas après seulement 3 requêtes .. Pour mon test, j'ai 1 page web avec 9 images donc j'arrive à "getter" la page + les deux premières images.

    En espérant que quelqu'un puisse me donner un peu d'aide.

    merci d'avance

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Fais un Dispose sur la réponse une fois que tu as récupéré le résultat, sinon la connection reste ouverte.

  3. #3
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 52
    Points : 48
    Points
    48
    Par défaut
    J'ai un soucis avec la méthode Dispose(), je peux pas l'appliquer sur mon objet HttpWebResponse ..

    Si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
         for(int i = 0; i < imgQueue.Count; i++){ 
                            console.AppendText("\t\t " + url  + imgQueue[i] + "\n");
     
                            myHttpWebRequest = HTTPMethod.makeRequest(url + imgQueue[i]);
                            console.AppendText("\t\t requete créée  \n");
                            console.ScrollToCaret();
                            myHttpWebResponse = HTTPMethod.getResponseSync(myHttpWebRequest);
     
    // dispose ici, c'est bien ça?
                            myHttpWebResponse.Dispose();
     
     
                            console.AppendText("\t\t retour ok \n");
                            console.ScrollToCaret();
                            Thread.Sleep(5000);
                      }
    il me sort :
    Error 1 'System.Net.HttpWebResponse' does not contain a definition for 'Dispose' and no extension method 'Dispose' accepting a first argument of type 'System.Net.HttpWebResponse' could be found (are you missing a using directive or an assembly reference?)
    désolé si ma question semble stupide sur ce coup là.
    Merci d'avance

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Mmmm... pour une raison qui m'échappe, dans les versions antérieures à la 4.0 l'interface IDisposable était implémentée explicitement... donc la méthode Dispose n'était pas directement accessible. Tu peux utiliser Close à la place.

    Sinon, une autre façon de faire est d'utiliser un bloc using :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    // je créé ma requête avec (HttpWebRequest)WebRequest.Create()
    HttpWebRequest myHttpWebRequest = HTTPMethod.makeRequest(url + "/");
     
    List<String> imgQueue;
    //j'exécute ma première requete sans soucis avec HttpWebRequest.GetReponse()
    using (HttpWebResponse myHttpWebResponse = HTTPMethod.getResponseSync(myHttpWebRequest,console))
    {
     
        // je parse la réponse pour récupérer une list d'images à récupérer
        imgQueue = HTTPMethod.getObjectsToRequest(myHttpWebResponse);
    }
     
    //puis je fais une boucle pour faire un get sur chacune des mes images :
    for(int i = 0; i < imgQueue.Count; i++){ 
         console.AppendText("\t\t " + url  + imgQueue[i] + "\n");
         myHttpWebRequest = HTTPMethod.makeRequest(url + imgQueue[i]);
         console.AppendText("\t\t requete créée  \n");
         console.ScrollToCaret();
         myHttpWebResponse = HTTPMethod.getResponseSync(myHttpWebRequest);
         console.AppendText("\t\t retour ok \n");
         console.ScrollToCaret();
         Thread.Sleep(5000);
    }
    C'est plus propre, parce que ça garantit que Dispose sera appelée, même si une exception se produit.

  5. #5
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 52
    Points : 48
    Points
    48
    Par défaut
    Ok j'ai utilisé le bloc using. Ca fonctionne très bien. Merci beaucoup.


    bonne fin de soirée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Plusieurs requêtes HTTP avec la même socket
    Par sabari dans le forum Réseau
    Réponses: 4
    Dernier message: 24/12/2014, 15h52
  2. Exécution de plusieurs requêtes SQL
    Par FatmaFafa dans le forum Oracle
    Réponses: 4
    Dernier message: 09/05/2012, 13h07
  3. Problème d'exécution de plusieurs requêtes
    Par zaza78 dans le forum Webi
    Réponses: 2
    Dernier message: 17/04/2010, 09h15
  4. Exécution de plusieurs requêtes SQL dans Oracle
    Par 4rocky4 dans le forum PL/SQL
    Réponses: 7
    Dernier message: 19/03/2009, 11h12
  5. Exécution de plusieurs requêtes
    Par The eye dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/11/2008, 14h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo