¿Cómo convertir el retorno de WebResponse.GetResponseStream en una cadena?

79

Veo muchos ejemplos, pero todos los leen en matrices de bytes o 256 caracteres a la vez, lentamente. ¿Por qué?

¿No es aconsejable simplemente convertir el Streamvalor resultante en una cadena donde pueda analizarlo?

Joan Venge
fuente

Respuestas:

59

Deberías crear un StreamReaderalrededor de la corriente, luego llamarReadToEnd .

Debería considerar llamar en su WebClient.DownloadStringlugar.

SLaks
fuente
1
Gracias SLaks, comprobando DownloadString ahora. En realidad, estoy obteniendo cadenas de código fuente diferentes en comparación con mi aplicación anterior donde usa browser.DocumentStream usando el control del navegador Winforms. ¿Crees que DownloadString lo arreglaría? Puedo crear una nueva pregunta si no es tan sencilla.
Joan Venge
5
Tiene un problema de codificación o necesita establecer un User-Agent.
SLaks
Gracias SLaks, ahora uso DownloadString, y es mejor que tengas razón. Ahora el resultado difiere ligeramente, no debería hacer una diferencia, pero obtengo cosas como en <a href=lugar del anterior que era <A href=. ¿Eso todavía está relacionado con la codificación o User-Agentcrees?
Joan Venge
2
Eso suena raro; IE podría normalizarlo.
SLaks
3
WebClienty HttpWebRequestuse HTTP sin formato sin navegador involucrado. Si diferentes navegadores muestran diferentes Ver fuentes , es un User-Agentproblema.
SLaks
141

Puedes usar StreamReader.ReadToEnd(),

using (Stream stream = response.GetResponseStream())
{
   StreamReader reader = new StreamReader(stream, Encoding.UTF8);
   String responseString = reader.ReadToEnd();
}
adatapost
fuente
1
@FaizanMubasher - Me gustaría sugerir LINQ To XML.
adatapost
2
Grande que usted ha señalado StreamReaderocupa el segundo parámetro Encoding.UTF8. No me
di
5
¿No debería la codificación basarse en el valor de response.CharacterSet en lugar de asumir un valor fijo de UTF8?
Heinzi
¿Muestra LINQ To XML?
PreguntonCojoneroCabrón
GetResponse and GetResponseStreampuede lanzar excepciones
PreguntonCojoneroCabrón
10

Como mencionó @Heinzi, se debe usar el conjunto de caracteres de la respuesta.

var encoding = response.CharacterSet == ""
    ? Encoding.UTF8
    : Encoding.GetEncoding(response.CharacterSet);

using (var stream = response.GetResponseStream())
{
    var reader = new StreamReader(stream, encoding);
    var responseString = reader.ReadToEnd();
}
Richard Schneider
fuente
5

Richard Schneider tiene razón. use el código a continuación para obtener datos del sitio que no sea utf8 charset obtendrá una cadena incorrecta.

using (Stream stream = response.GetResponseStream())
{
   StreamReader reader = new StreamReader(stream, Encoding.UTF8);
   String responseString = reader.ReadToEnd();
}

"No puedo votar. Así que escribí esto.

Howard Lou
fuente
3

Puede crear un StreamReaderalrededor de la corriente y luego llamar StreamReader.ReadToEnd().

StreamReader responseReader = new StreamReader(request.GetResponse().GetResponseStream());
var responseData = responseReader.ReadToEnd();
Mari
fuente