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
-----------------------------------------------
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Simon Mourier [SoftFluent]
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);
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. www.softfluent.com
"wmn" a écrit dans le message de news: 45755c0e$0$21150$
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 -----------------------------------------------
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);
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.
www.softfluent.com
"wmn" <wmn@nulpar.org> a écrit dans le message de news:
45755c0e$0$21150$7a628cd7@news.club-internet.fr...
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
-----------------------------------------------
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);
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. www.softfluent.com
"wmn" a écrit dans le message de news: 45755c0e$0$21150$
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 -----------------------------------------------