Wie konvertiere ich WebResponse.GetResponseStream-Rückgabe in eine Zeichenfolge?

79

Ich sehe viele Beispiele, aber alle lesen sie langsam in Byte-Arrays oder 256 Zeichen gleichzeitig ein. Warum?

Ist es nicht ratsam, den resultierenden StreamWert einfach in eine Zeichenfolge zu konvertieren, in der ich ihn analysieren kann?

Joan Venge
quelle

Antworten:

59

Sie sollten ein StreamReaderum den Stream herum erstellen und dann aufrufen ReadToEnd.

Sie sollten WebClient.DownloadStringstattdessen anrufen .

SLaks
quelle
1
Vielen Dank an SLaks, die jetzt DownloadString überprüfen. Tatsächlich erhalte ich andere Quellcode-Zeichenfolgen als meine alte App, in der browser.DocumentStream mithilfe der Winforms-Browsersteuerung verwendet wird. Sie denken, DownloadString würde das Problem beheben? Ich kann eine neue Frage erstellen, wenn sie nicht so einfach ist.
Joan Venge
5
Sie haben entweder ein Codierungsproblem oder müssen ein festlegen User-Agent.
SLaks
Danke SLaks, ich benutze jetzt DownloadString und es ist besser, dass Sie Recht haben. Jetzt unterscheidet sich das Ergebnis geringfügig, sollte keinen Unterschied machen, aber ich bekomme Sachen wie <a href=anstelle der alten, die es gab <A href=. Das hängt immer noch mit der Codierung zusammen, oder User-Agentdenkst du?
Joan Venge
2
Das klingt komisch; Es könnte vom IE normalisiert werden.
SLaks
3
WebClientund HttpWebRequestverwenden Sie rohes HTTP ohne Browser. Wenn verschiedene Browser unterschiedliche Ansichtsquellen anzeigen , liegt ein User-AgentProblem vor.
SLaks
139

Sie können verwenden StreamReader.ReadToEnd(),

using (Stream stream = response.GetResponseStream())
{
   StreamReader reader = new StreamReader(stream, Encoding.UTF8);
   String responseString = reader.ReadToEnd();
}
Adatapost
quelle
1
@FaizanMubasher - Ich möchte LINQ To XML vorschlagen.
Adatapost
2
Schön, dass Sie darauf hingewiesen haben, StreamReadernimmt zweiten Parameter Encoding.UTF8.
Ich
5
Sollte die Codierung nicht auf dem Wert von response.CharacterSet basieren, anstatt einen festen Wert von UTF8 anzunehmen?
Heinzi
LINQ To XML-Beispiel?
PreguntonCojoneroCabrón
GetResponse and GetResponseStreamkann Ausnahmen
PreguntonCojoneroCabrón
10

Wie @Heinzi erwähnte, sollte der Zeichensatz der Antwort verwendet werden.

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
quelle
5

Richard Schneider hat recht. Verwenden Sie den folgenden Code, um Daten von einer Site abzurufen, die kein utf8-Zeichensatz ist. Dadurch wird eine falsche Zeichenfolge angezeigt.

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

"Ich kann nicht wählen. Also schrieb ich das.

Howard Lou
quelle
3

Sie können einen StreamReaderStream erstellen und dann aufrufen StreamReader.ReadToEnd().

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