¿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?

Respuestas:


59

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

Debería considerar llamar en su WebClient.DownloadStringlugar.


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();
}

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();
}

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.


3

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

StreamReader responseReader = new StreamReader(request.GetResponse().GetResponseStream());
var responseData = responseReader.ReadToEnd();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.