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 :

c# HttpWebRequest Multi tache [Débutant]


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 91
    Points : 88
    Points
    88
    Par défaut c# HttpWebRequest Multi tache
    Bonjour a tous .

    j'utilise httpwebrequest pour faire GET sur un lien alors je dois envoyer trois requettes en meme temps pour avoir la réponse le plus vite possbile .
    je lance tache1 tache2 tache3 , la premiere tache qui me répond je dois arréter les autres taches .
    comment je peux faire pour résoudre ce probleme .

    Merci a tous .

    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
     
       for(int i = 0; i < 3; i++)
                {
                    Task.Run(() =>
                    {
                        AsyncGet("https://exemple.com/index.html");
                    });
                }
     
     
            /*
              Fonction pour faire mon GET
             */
            public Task<string> AsyncGet(string url)
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.AllowAutoRedirect = true;
                request.CookieContainer = container;
     
                Task<WebResponse> task = Task.Factory.FromAsync(
                    request.BeginGetResponse,
                    asyncResult => request.EndGetResponse(asyncResult),
                    (object)null);
     
                return task.ContinueWith(t => ReadStreamFromResponse(t.Result));
     
            }
     
            private string ReadStreamFromResponse(WebResponse response)
            {
                using (Stream responseStream = response.GetResponseStream())
                using (StreamReader sr = new StreamReader(responseStream))
                {
     
                    string strContent = sr.ReadToEnd();
     
     
                    return strContent;
                }
            }

  2. #2
    Membre chevronné
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 652
    Points : 2 180
    Points
    2 180
    Par défaut
    Bonjour,

    Il y a plusieurs façons, mais je pense que la plus propre c'est l'utilisation d'un seul et même CancellationToken.

  3. #3
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Points : 10 543
    Points
    10 543
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Je vous invite à consulter le tutoriel que j'avais écris à ce sujet, notamment le point II-D.

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 91
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par François DORIN Voir le message
    Bonjour,

    Je vous invite à consulter le tutoriel que j'avais écris à ce sujet, notamment le point II-D.
    Bonjour ,
    j'ai essayé cette methode avec une Loop Foreach , Alors le probleme quand je reçois la réponse de la premiere requette les autres ne s'annulent pas .
    note : j'envoie trois requettes sur le meme site .

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
            static void asyncPost(string url1, string referrer,string data)
            {
     
                var cts = new CancellationTokenSource();
                var _lock = new Object();
                var po = new ParallelOptions();
                po.CancellationToken = cts.Token;
                po.MaxDegreeOfParallelism = System.Environment.ProcessorCount;
                var listOfUrls = new List<string>() { url1, url1, url1};
                try
                {
                    ParallelLoopResult result = Parallel.ForEach(listOfUrls, po, (url) =>
                    {
     
                        po.CancellationToken.ThrowIfCancellationRequested();
     
                        byte[] data = Encoding.UTF8.GetBytes(data);
                        HttpWebRequest postlogin = (HttpWebRequest)WebRequest.Create(url1);
                        postlogin.AllowAutoRedirect = true;
                        postlogin.CookieContainer = container;
                        postlogin.Method = "POST";
                        postlogin.ContentType = "application/x-www-form-urlencoded";
                        postlogin.ContentLength = data.Length;
                        postlogin.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.30 Safari/537.36";
                        postlogin.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3";
                        postlogin.Referer = referrer;
                        postlogin.Headers.Add("Accept-Language: en-GB,en-US;q=0.9,en;q=0.8");
     
                        using (Stream streamLogin = postlogin.GetRequestStream())
                        {
                            streamLogin.Write(data, 0, data.Length);
                        }
     
                        HttpWebResponse responselogin = (HttpWebResponse)postlogin.GetResponse();
     
     
                        var responseString = StreamConvert(responselogin);
     
                        lock (_lock)
                        {
                            if (responseString.Length > 6)
                            {
                                responsResult = responseString;
     
                                cts.Cancel();
     
                            }
                        }
     
                    });
     
     
                    //return responsResult;
                }

  5. #5
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Points : 10 543
    Points
    10 543
    Billets dans le blog
    21
    Par défaut
    C'est normal. L'idée du jeton d'annulation, c'est d'annuler proprement une ou plusieurs tâches, il faut donc lui dire quand c'est possible.

    Dans votre code, vous ne vérifiez qu'au tout début, avant que la requête ne soit lancée. Il faut modifier un peu votre code de la manière suivante :
    • Utiliser postlogin.GetResponseAsync() et stocker dans une variable la tâche retournée dans une variable (par exemple nommée task)
    • Ajouter du code pour attendre la tâche, en précisant le jeton d'annulation : task.Wait(po.CancelationToken)

    Ainsi, dès qu'une des requêtes aura abouti, les autres seront annulées.

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 91
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par François DORIN Voir le message
    C'est normal. L'idée du jeton d'annulation, c'est d'annuler proprement une ou plusieurs tâches, il faut donc lui dire quand c'est possible.

    Dans votre code, vous ne vérifiez qu'au tout début, avant que la requête ne soit lancée. Il faut modifier un peu votre code de la manière suivante :
    • Utiliser postlogin.GetResponseAsync() et stocker dans une variable la tâche retournée dans une variable (par exemple nommée task)
    • Ajouter du code pour attendre la tâche, en précisant le jeton d'annulation : task.Wait(po.CancelationToken)

    Ainsi, dès qu'une des requêtes aura abouti, les autres seront annulées.
    ça marche tres bien merci pour votre aide monsieur Dorin , j'ai eu un petit soucis aves les cookies .
    j'envoie trois requettes pour Login : R1 R2 R3.
    par exemple la R1 me donne le bon resultat et enregistre les cookies .
    La R2 et R3 me donne erreur puisque c'est bon j'ai déja eu mon résultat , mais la R2 et R3 ecrase le bon cookie de R1 .
    quand je procède pour la requette suivante pour un GET la page qui vient apres le Login je reçois une érreur .
    par ce que les cookies étaient écrasé par La R2 et R3 dans la précédente étape .
    il faut que je trouve un moyen pour manipuler les cookies .
    Merci monsieur DORIN .

  7. #7
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Points : 10 543
    Points
    10 543
    Billets dans le blog
    21
    Par défaut
    Une WebRequest ne gère pas automatiquement les cookies. Si vous voulez qu'ils soient transmis, il faut les récupérer depuis la réponse, pour les transmettre aux requêtes suivantes.

    Ici, au niveau de la réponse, vous ne traitez que le contenu. Pas les cookies ! Cf. HttpWebResponse.Cookies.

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 91
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par François DORIN Voir le message
    Une WebRequest ne gère pas automatiquement les cookies. Si vous voulez qu'ils soient transmis, il faut les récupérer depuis la réponse, pour les transmettre aux requêtes suivantes.

    Ici, au niveau de la réponse, vous ne traitez que le contenu. Pas les cookies ! Cf. HttpWebResponse.Cookies.
    Problème résolu merci monsieur DORIN .

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

Discussions similaires

  1. application multi taches
    Par tiagocerqueira dans le forum Qt
    Réponses: 1
    Dernier message: 26/05/2010, 10h05
  2. Temps réel, multi tache, synchronistation
    Par Invité dans le forum Ada
    Réponses: 8
    Dernier message: 07/09/2009, 19h20
  3. Eviter le multi tache?
    Par Fanta310 dans le forum Multithreading
    Réponses: 9
    Dernier message: 17/06/2008, 22h20
  4. Calcul parallèles et multi taches !
    Par Darktrouble dans le forum Débuter
    Réponses: 1
    Dernier message: 03/03/2008, 15h29
  5. [Thread]multi-tache
    Par nick1000 dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 14/06/2005, 09h10

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