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

Odpowiedzi:


58

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

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


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

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

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.


3

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

StreamReader responseReader = new StreamReader(request.GetResponse().GetResponseStream());
var responseData = responseReader.ReadToEnd();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.