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
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
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(); } }
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.
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
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.
Quelqu'un aurait une idée du problème ? Sur des postes "corrects" je n'ai pas encore rencontré ce souci.
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); ...
Partager