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 :

Récupération des données sur un NetworkStream


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut Récupération des données sur un NetworkStream
    Bonjour,

    Je rencontre un problème lors de la lecture d'un NetworkStream, mais pas de manière systématique. Le problème semble surtout arriver sur de vieilles machines, qui ont donc tendance à bien ramer =)

    Pour situer le contexte, je cherche à récupérer des informations issues de PDF formulaire. Sur ces PDF un bouton permet l'envoi des données du formulaire via HTTP POST sous forme de XML.

    Voilà comment est réalisée la lecture
    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
    TcpClient client = null;
     
    try
    {
        client = _listener.EndAcceptTcpClient(result);
     
        using (NetworkStream ns = client.GetStream())
        using (MemoryStream ms = new MemoryStream())
        {
            string data = null;
     
            if (ns.CanRead)
            {
                int bytesRead = 0;
                byte[] buffer = new byte[10240];
     
                while ((bytesRead = ns.Read(buffer, 0, buffer.Length)) != 0)
                {
                    ms.Write(buffer, 0, bytesRead);
                    if (bytesRead < buffer.Length) { break; }
                }
     
                data = Encoding.UTF8.GetString(ms.ToArray());
            }
     
            OnDataReceived(data);
        }
    }
    catch (Exception ex)
    {
        OnReceiveError(ex);
    }
    finally
    {
        if (client != null)
        {
            client.Close();
        }
    }
    Le problème que je rencontre parfois c'est que je reçois uniquement l'entête HTTP. Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    POST / HTTP/1.1
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
    Content-Type: application/xml; charset=utf-8
    Content-Length: 724
    Referer: file:///....monpdf.pdf
    Acrobat-Version: 9.3.4
    Accept-Language: fr
    UA-CPU: x86
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Wanadoo 7.1 ; NaviWoo1.1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
    Host: localhost:49200
    Connection: Keep-Alive
    Dans l'entête le Content-Length est bien défini, donc il devrait y avoir des données. Mais je ne reçois que l'entête.

    Il faudrait que je teste éventuellement avec la propriété DataAvailable plutôt que sur la taille des données reçues par le Read, si jamais je reçois zéro mais qu'il reste des données. Mais je ne pense pas que cela corrige le problème, car je ne vois pas en quoi cela concernait juste les vieilles machines.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
    int bytesRead = 0;
    byte[] buffer = new byte[client.ReceiveBufferSize];
    do
    {
        bytesRead = ns.Read(buffer, 0, buffer.Length);
        ms.Write(buffer, 0, bytesRead);
    }
    while (ns.DataAvailable);
    ...
    Quelqu'un aurait une idée du problème ? Sur des postes "corrects" je n'ai pas encore rencontré ce souci.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 74
    Par défaut
    Pourquoi tu n'utilise pas HttpListener?

    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
     
    string rep = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) + "\\";
     
    _listener = new HttpListener();
    _listener.Prefixes.Add("http://+:" + Cte.Port + "/");   //A voir les droits que tu veut mettre
     
    _listener.Start();
     
    while (_ecouteActif)
    {
        try
        {
            //winstore/CallUR
            HttpListenerContext context = _listener.GetContext();
     
            HttpListenerRequest request = context.Request;
     
     
            System.Text.Encoding encoding = request.ContentEncoding;
            System.IO.StreamReader reader = new System.IO.StreamReader(request.InputStream, encoding);
     
            HttpListenerResponse response = context.Response;
            System.IO.Stream output = response.OutputStream;
     
            string input = reader.ReadToEnd();
            input = HttpUtility.HtmlDecode(input);
     
            string responseString = "BLABLA"; //la reponse
            byte[] buffer;
            buffer = encoding.GetBytes(responseString); //System.Text.Encoding.Unicode.GetBytes(responseString);
            response.ContentLength64 = buffer.Length;
            output.Write(buffer, 0, buffer.Length);
            output.Close();
        }
        catch
        {
        }
    }

  3. #3
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Le TcpListener sert à autre chose, il ne se limite pas juste à la partie qui pose problème dans le cas présent.

Discussions similaires

  1. [MySQL] Récupération des données sur serveur MySQL
    Par Thibault85 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 04/06/2014, 09h38
  2. Réponses: 3
    Dernier message: 10/10/2011, 11h10
  3. Réponses: 3
    Dernier message: 18/04/2011, 13h43
  4. Réponses: 4
    Dernier message: 02/03/2010, 16h09
  5. [MySQL] problème de syntaxe sur la récupération des données
    Par soshin dans le forum PHP & Base de données
    Réponses: 28
    Dernier message: 23/11/2006, 12h34

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