OVH Cloud OVH Cloud

[VS 2005] Problème avec HTTPRequest

3 réponses
Avatar
Boris Sargos
Salut !

il m'arrive une chose curieuse, dont je n'ai pas trouvé l'explication.
Après avoir passé ma journée dessus, je capitule. Je tente d'accéder à
la même page Internet une dizaine de fois, successivement. Voici le code
que j'utilise :

int i=0; string url=string.Empty;
while(i++<10) {
try {
url="http://www.codeproject.com/cs/miscctrl/LightColorPicker.asp";
// Création de la requête
HttpWebRequest hwrq=(HttpWebRequest)WebRequest.Create(url);
// Envoi de la requête
HttpWebResponse wrs=(HttpWebResponse)hwrq.GetResponse();
// Crétion du flux de données de réception
Stream str=wrs.GetResponseStream();
} catch(WebException ex) {
...
} catch(Exception ex) {
...
}

Tout se passe bien pour les deux premières itérations: la requête est
envoyée, et les données reçues en quelques centièmes de secondes.
En revanche, ça ne fonctionne plus à partir de la troisième itération !
Un point d'arrêt dans la première clause catch me permet de savoir que
le TimeOut de la connection a été dépassé. Sachant que je n'ai pas
défini le TimeOut, et qu'à défaut il doit être autour de quinze
secondes, c'est que vraiment qu'il ne trouve plus la page. Pourquoi ?
Pensant que j'avais "fatigué" le serveur, j'ai inséré entre chaque
itération une boucle vide, sur 100000 itérations, pour espacer mes
demandes au serveur. J'ai essayé plein d'urls différentes, sur des
serveurs différents. Ca n'a rien donné. Seul google a fonctionné.
Je ne comprends pas du tout.

Si cela est déjà arrivé à quelqu'un ou que l'un d'entre vous a une idée,
ça me serait vraiment utile.

Rappel: j'utilise VS 2005.

Merci,
Boris.

3 réponses

Avatar
Simon Mourier [MS]
Il faut fermer le stream à un moment ou un autre. Le mieux c'est de faire
comme ceci

int i=0; string url=string.Empty;
while(i++<10) {
try {
url="http://www.codeproject.com/cs/miscctrl/LightColorPicker.asp";
// Création de la requête
HttpWebRequest hwrq=(HttpWebRequest)WebRequest.Create(url);
// Envoi de la requête
HttpWebResponse wrs=(HttpWebResponse)hwrq.GetResponse();
// Crétion du flux de données de réception
using (Stream str=wrs.GetResponseStream())
{
}
} catch(WebException ex) {
...
} catch(Exception ex) {
...
}

Simon.

"Boris Sargos" a écrit dans le message de news:
41f2fe26$0$19433$
Salut !

il m'arrive une chose curieuse, dont je n'ai pas trouvé l'explication.
Après avoir passé ma journée dessus, je capitule. Je tente d'accéder à la
même page Internet une dizaine de fois, successivement. Voici le code que
j'utilise :

int i=0; string url=string.Empty;
while(i++<10) {
try {
url="http://www.codeproject.com/cs/miscctrl/LightColorPicker.asp";
// Création de la requête
HttpWebRequest hwrq=(HttpWebRequest)WebRequest.Create(url);
// Envoi de la requête
HttpWebResponse wrs=(HttpWebResponse)hwrq.GetResponse();
// Crétion du flux de données de réception Stream
str=wrs.GetResponseStream();
} catch(WebException ex) {
...
} catch(Exception ex) {
...
}

Tout se passe bien pour les deux premières itérations: la requête est
envoyée, et les données reçues en quelques centièmes de secondes.
En revanche, ça ne fonctionne plus à partir de la troisième itération ! Un
point d'arrêt dans la première clause catch me permet de savoir que le
TimeOut de la connection a été dépassé. Sachant que je n'ai pas défini le
TimeOut, et qu'à défaut il doit être autour de quinze secondes, c'est que
vraiment qu'il ne trouve plus la page. Pourquoi ?
Pensant que j'avais "fatigué" le serveur, j'ai inséré entre chaque
itération une boucle vide, sur 100000 itérations, pour espacer mes
demandes au serveur. J'ai essayé plein d'urls différentes, sur des
serveurs différents. Ca n'a rien donné. Seul google a fonctionné.
Je ne comprends pas du tout.

Si cela est déjà arrivé à quelqu'un ou que l'un d'entre vous a une idée,
ça me serait vraiment utile.

Rappel: j'utilise VS 2005.

Merci,
Boris.


Avatar
Boris Sargos
Salut Simon,

merci de m'avoir répondu. Tu as raison, ça marche parfaitement. Mais je
ne comprends pas pourquoi. Quel est le rapport entre une WebException et
un Stream ? Et pourquoi cela marche les deux premières fois et non pas
seulement la première ?

Bon, en tous cas merci, car je n'aurais jamais pensé à çà !
A+
Boris.
Avatar
Simon Mourier [MS]
Cela n'a rien à voir avec la gestion des exceptions, et c'est stipulé dans
la doc de GetResponseStream:
Note You must call either the Stream.Close or HttpWebResponse.Close
method to close the stream and release the connection for reuse. It is not
necessary to call both Stream.Close and HttpWebResponse.Close, but doing so
does not cause an error. Failure to close the stream will cause your
application to run out of connections.

voir ici pour plus d'infos
http://weblogs.asp.net/feroze_daud/archive/2004/01/21/61400.aspx

Simon.

"Boris Sargos" a écrit dans le message de news:

Salut Simon,

merci de m'avoir répondu. Tu as raison, ça marche parfaitement. Mais je ne
comprends pas pourquoi. Quel est le rapport entre une WebException et un
Stream ? Et pourquoi cela marche les deux premières fois et non pas
seulement la première ?

Bon, en tous cas merci, car je n'aurais jamais pensé à çà !
A+
Boris.