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

VB.NET Discussion :

Meilleure méthode pour envoi de données par POST


Sujet :

VB.NET

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 67
    Points
    67
    Par défaut Meilleure méthode pour envoi de données par POST
    Bonjour,

    Dans mon programme j'ai besoin d'envoyer des données liées à l'utilisation sur un serveur, ce que je fais par requête POST sur un script PHP. Cependant il arrive que cette action soit un peu longue du coup pendant ce temps, le programme ne répond pas vraiment, il n'enregistre plus les données et de plus après il arrive que les données enregistrées soit fausses (pas d'enregistrement, enregistrement en double...). Tout cela m'embête et j'ai eu l'idée de mettre la procédure d'envoi dans un BackgroundWorker histoire que ça n'influence pas le programme principal. Deux questions : est ce que c'est la bonne méthode ET est ce que c'est normal que le programme continue à laguer un petit peu ?

    Encore une question : j'aimerais modifier l'icône de notification quand j'envoie les données, de manière à que l'utilisateur sache quand les données sont envoyées, et quand c'est terminé, cependant :

    • Si je demande au BackgroudWorker de modifier l'icône (et le curseur de la souris aussi), une exception est levée car je tente de faire une opération inter-threads
    • Si je le fais dans le programme, l'icône est définie, mais comme le BackgroundWorker fait une tâche en parallèle, et que mon code ressemble à :
      ChangerIcone(IconeEnvoi)
      BackgroundWorker.RunWorkerASync
      ChangerIcone(IconeNormale)
      Bah l'icône est redéfinir tout de suite en normale

    Alors quelle est selon vous la solution à mon problème ?

    Merci d'avance

    Thomas

  2. #2
    Membre émérite Avatar de meziantou
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Points : 2 439
    Points
    2 439
    Par défaut
    Le background worker doit correspondre à ton besoin.

    Pour ton problème d'icone il faut gérer l'évènement RunWorkerCompleted du background worker pour remettre l'icone par défaut. De plus tu as aussi l'évènement ProgressChanged qui permet de notifier l'utilisateur de l'avancement.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 67
    Points
    67
    Par défaut
    Et as tu des idées pour le comptage en double, les lags... ? On m'a parlé des délégués, est ce que ça peut m'aider ?

  4. #4
    Membre émérite Avatar de meziantou
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Points : 2 439
    Points
    2 439
    Par défaut
    Pas d'idée sans plus d'info sur ton programme. Je ne vois pas en quoi les délégués pourraient aider.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 67
    Points
    67
    Par défaut
    D'accord. En fait le programme est un compteur de clics, de touches et de scrolls qui fonctionne grâce à ces deux hooks :
    http://pastebin.com/FHn18WFs
    http://pastebin.com/yeqtX5pi
    Après, je propose aux gens de mettre leur statistiques sur mon site pour avoir encore plus de statistiques inutiles (et donc indispensables, voir ici). Tout cela fonctionne, il n'y a que la partie Interaction Programme <-> Serveur qui fonctionne mal et qui cause des problèmes au programme.
    J'utilise ce code pour envoyer les requêtes POST :
    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
      Public Function HttpPost(ByVal URI As String, ByVal Parameters As String) As String
            System.Net.ServicePointManager.Expect100Continue = False
            Dim req As HttpWebRequest = DirectCast(HttpWebRequest.Create(URI), HttpWebRequest)
            'req.Proxy = new WebProxy("127.0.0.1:8080");
            req.ContentType = "application/x-www-form-urlencoded"
            req.Method = "POST"
            req.Headers.Add("Cookie: PHPSESSID=72ee54199f05f4123f50f6cb7e0f0bfb")
            Dim bytes As Byte() = System.Text.Encoding.ASCII.GetBytes(Parameters)
            req.ContentLength = bytes.Length
            Dim os As System.IO.Stream = req.GetRequestStream()
            os.Write(bytes, 0, bytes.Length)
            os.Close()
            Dim resp As HttpWebResponse = Nothing
            Try
                resp = DirectCast(req.GetResponse(), HttpWebResponse)
            Catch ew As Exception
                Dim coucou As String = ew.Message
            End Try
            If resp Is Nothing Then
                Return Nothing
            End If
            Dim sr As New System.IO.StreamReader(resp.GetResponseStream())
            'MessageBox.Show("STATUSCODE = " + resp.StatusCode.ToString());
            Return sr.ReadToEnd().Trim()
        End Function
    Que j'appelle avec cette fonction qui envoie les données
    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
       Sub EnvoyerDonnees()
            If Username = "" Then
                MsgBox("Avant d'envoyer les données sur Internet, veuillez vous identifier dans la configuration")
                Exit Sub
            End If
            If ConnexionInternet = False Then
                MsgBox("Vous n'êtes pas connecté à Internet. Pour réexécuter le test de connexion, rendez-vous dans les paramètres")
                Exit Sub
            End If
            Dim param = "&username=" & Username & "&clicsgauches=" & NbrClicsGauches & "&clicsdroits=" & NbrClicsDroits & "&clicsmilieu=" & NbrClicsMilieu & "&scrollshaut=" & NbrScrollsHaut & "&scrollsbas=" & NbrScrollsBas & "&touches=" & NbrTouches & "&temps=" & Temps
            Dim ResultatHttpPost = HttpPost(AdresseServeur & "upload.php", param)
            If ResultatHttpPost = "0" Then
                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Citrik Digital Inc.\CitriClics", "TAE", AES_Encrypt(0, CryptKey))
                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Citrik Digital Inc.\CitriClics", "CDAE", AES_Encrypt(0, CryptKey))
                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Citrik Digital Inc.\CitriClics", "SHAE", AES_Encrypt(0, CryptKey))
                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Citrik Digital Inc.\CitriClics", "SBAE", AES_Encrypt(0, CryptKey))
                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Citrik Digital Inc.\CitriClics", "CMAE", AES_Encrypt(0, CryptKey))
                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Citrik Digital Inc.\CitriClics", "CGAE", AES_Encrypt(0, CryptKey))
                NbrTouchesAE = 0
                NbrClicsAE = 0
                NbrClicsDroitsAE = 0
                NbrClicsGauchesAE = 0
                NbrClicsMilieuAE = 0
                NbrScrollsAE = 0
                NbrScrollsHautAE = 0
                NbrScrollsBasAE = 0
                SauverDonnees()
                Parametres.FaireLoad()
            Else
                MsgBox("Désolé, mais une erreur fatale est survenue (erreur : " & vbCrLf & ResultatHttpPost, vbCritical, "Erreur")
            End If
            Afficher()
        End Sub
    Si tu veux plus de détails, demande moi.

Discussions similaires

  1. [Débuter] Envoi de données par POST en HTTP
    Par Heroiik dans le forum Réseau
    Réponses: 5
    Dernier message: 31/07/2013, 19h34
  2. Réponses: 1
    Dernier message: 08/03/2010, 15h40
  3. Erreur lors de l'envoi de données par post
    Par kohsaka dans le forum jQuery
    Réponses: 1
    Dernier message: 18/01/2009, 22h21
  4. méthode pour envoi d'un flux post
    Par marion782 dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 13/04/2007, 18h40
  5. Meilleur méthode pour stocker mes données
    Par cyberlewis dans le forum Windows
    Réponses: 6
    Dernier message: 03/07/2004, 12h53

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