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.