gratifiant > microsoft.* > microsoft.dotnet.csharp

wmn (05/12/2006, 13h46)
bonjour,

ci-dessous le code que j'utilise pour rapatrier le contenu html d'une url.

il y a un problème, lorsque le charset annoncé dans les headers http
n'est pas le même que celui annoncé dans le code html de la page.
jusqu'à présent quand je constate une différence je download à nouveau
la page, car je n'arrive pas à lire 2 fois (ce qui est conforme à la
doc) le StreamReader récupéré via le res.GetResponseStream().
je cherche donc une solution qui m'évite de re-downloader la page.

avez vous une solution ? (car il doit forcément y en avoir une !!!;)

wmn.

-----------------------------------------------
Uri url = new Uri("http://www....");

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url
..AbsoluteUri);
HttpWebResponse res = (HttpWebResponse)req.GetResponse();

string html = new StreamReader(res.GetResponseStream(),
Encoding.GetEncoding(res.CharacterSet), false).ReadToEnd();

// getHtmlCharset return le charset du code html
string charset = getHtmlCharset(html);
if (charset != res.CharacterSet.ToLower())
html = new StreamReader(res.GetResponseStream(),
Encoding.GetEncoding(charset), false).ReadToEnd();

.... reste du traitement
-----------------------------------------------
Simon Mourier [SoftFluent] (06/12/2006, 11h13)
Il faut conserver le retour du serveur sous forme d'un MemoryStream, plutôt
que sous la forme d'une chaîne de caractère.
Notez au passage que le code ReadToEnd() ne fonctionnera pas bien si le
réseau est lent. Il faut absolument faire une boucle jusqu'à ce que le
stream ne renvoie plus rien.

Uri url = new Uri("http://www.microsoft.com");

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
HttpWebResponse res = (HttpWebResponse)req.GetResponse();

Stream inputStream = res.GetResponseStream();

MemoryStream outputStream = new MemoryStream();
byte[] buffer = new byte[1024]; // par exemple
int read;
do
{
read = inputStream.Read(buffer, 0, buffer.Length);
if (read > 0)
{
outputStream.Write(buffer, 0, read);
}
}
while(read > 0);

Encoding encoding = (((res.CharacterSet == null) ||
(res.CharacterSet.Length ==
0))?Encoding.Default:Encoding.GetEncoding(res.Char acterSet));

string html = encoding.GetString(outputStream.GetBuffer(), 0,
(int)outputStream.Length);
string charset = getHtmlCharset(html);
if (string.Compare(charset, res.CharacterSet, true) != 0)
{
encoding = Encoding.GetEncoding(charset);
html = encoding.GetString(outputStream.GetBuffer(), 0,
(int)outputStream.Length);
}
outputStream.Close();

Si vous pouviez d'ailleurs transformer votre fonction getHtmlCharset pour
qu'elle prenne un tableau d'octets (comme Encoding.GetString) à la place
d'une chaîne vous gagneriez en mémoire et performance en évitant une
conversion, mais c'est optionnel :-)
Simon.


"wmn" <wmn> a écrit dans le message de news:
45755c0e$0$21150$7a628cd7...
[..]
wmn (06/12/2006, 12h48)
merci Simon, ça fonctionne très bien
Discussions similaires