Jak przekonwertować zwrot WebResponse.GetResponseStream na ciąg?

79

Widzę wiele przykładów, ale wszystkie z nich odczytują je powoli na tablice bajtów lub 256 znaków naraz. Czemu?

Czy nie jest wskazane, aby po prostu przekonwertować wynikową Streamwartość na ciąg, w którym mogę ją przeanalizować?

Joan Venge
źródło

Odpowiedzi:

58

Powinieneś utworzyć StreamReaderwokół strumienia, a następnie zadzwoń ReadToEnd.

Zamiast tego powinieneś rozważyć zadzwonienie WebClient.DownloadString.

SLaks
źródło
1
Dzięki, SLaks, sprawdzam DownloadString teraz. W rzeczywistości otrzymuję różne ciągi kodu źródłowego w porównaniu do mojej starej aplikacji, w której używa ona browser.DocumentStream przy użyciu kontrolki przeglądarki Winforms. Myślisz, że DownloadString to naprawi? Mogę utworzyć nowe pytanie, jeśli nie jest tak proste.
Joan Venge,
5
Masz problem z kodowaniem lub musisz ustawić plik User-Agent.
SLaks
Dzięki SLaks, używam teraz DownloadString i lepiej, że masz rację. Teraz wynik jest nieco inny, nie powinno to robić różnicy, ale <a href=zamiast tego, co było, dostaję coś takiego, jak stary <A href=. To wciąż jest związane z kodowaniem, czy User-Agentmyślisz?
Joan Venge,
2
To brzmi dziwnie; może być znormalizowany przez IE.
SLaks
3
WebClienti HttpWebRequestużywaj surowego HTTP bez przeglądarki. Jeśli różne przeglądarki pokazują różne źródła widoku , jest to User-Agentproblem.
SLaks
142

Możesz użyć StreamReader.ReadToEnd(),

using (Stream stream = response.GetResponseStream())
{
   StreamReader reader = new StreamReader(stream, Encoding.UTF8);
   String responseString = reader.ReadToEnd();
}
adatapost
źródło
1
@FaizanMubasher - chciałbym zasugerować LINQ To XML.
adatapost
2
Świetnie, że wskazałeś, StreamReaderzajmuje drugi parametr Encoding.UTF8. Nie zauważyłem tego na początku, patrząc na dokumentację MS
nowy druk
5
Czy kodowanie nie powinno opierać się na wartości response.CharacterSet zamiast zakładać stałą wartość UTF8?
Heinzi
LINQ To XML przykład?
PreguntonCojoneroCabrón
GetResponse and GetResponseStreammoże rzucać wyjątki
PreguntonCojoneroCabrón
10

Jak wspomniał @Heinzi, należy użyć zestawu znaków odpowiedzi.

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
źródło
5

Richard Schneider ma rację. użyj poniższego kodu, aby pobrać dane ze strony, która nie jest zestawem znaków utf8, otrzyma zły ciąg.

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

„Nie mogę głosować. Więc to napisałem.

Howard Lou
źródło
3

Możesz utworzyć StreamReaderwokół strumienia, a następnie zadzwonić StreamReader.ReadToEnd().

StreamReader responseReader = new StreamReader(request.GetResponse().GetResponseStream());
var responseData = responseReader.ReadToEnd();
Mari
źródło