Lesen Sie den Text aus der Antwort

71
HttpWebRequest request = WebRequest.Create("http://google.com") as HttpWebRequest;  

request.Accept = "application/xrds+xml";  
HttpWebResponse response = (HttpWebResponse)request.GetResponse();  

WebHeaderCollection header = response.Headers;

Hier gibt Google Text zurück. Wie lese ich es?

Niraj Choubey
quelle

Antworten:

119

Sie "application/xrds+xml"gaben mir Probleme, ich erhielt eine Inhaltslänge von 0 (keine Antwort).

Nachdem Sie dies entfernt haben, können Sie mit auf die Antwort zugreifen response.GetResponseStream().

HttpWebRequest request = WebRequest.Create("http://google.com") as HttpWebRequest;

//request.Accept = "application/xrds+xml";  
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

WebHeaderCollection header = response.Headers;

var encoding = ASCIIEncoding.ASCII;
using (var reader = new System.IO.StreamReader(response.GetResponseStream(), encoding))
{
    string responseText = reader.ReadToEnd();
}
STW
quelle
11
Beachten Sie, dass dies eine ASCII-Codierung voraussetzt, die möglicherweise falsch ist.
Jon Skeet
1
Beachten Sie auch, dass die WebHeaderCollectionZeile nicht erforderlich ist, um den Antworttext abzurufen.
Sam
1
Beachten Sie auch, dass die HTTP-Antwort nicht in einen using-Block eingeschlossen ist. Wenn zwischen der Antwort und dem nächsten using-Block eine Ausnahme oder Rückgabe auftritt, wird die Verbindung nicht geschlossen.
Sam
@ Sam danke für die vielen Bearbeitungsversuche, ich bin jedoch besorgt, dass das Ergebnis Ihrer Änderungen von vielen Benutzern (6 in mehreren Stunden) weitgehend abgelehnt wurde. Ich habe Ihre Änderungen rückgängig gemacht und werde versuchen, die Antwort ebenfalls zu verbessern.
STW
Ich habe ein Ergebnis, das enthält HttpResponseContext, aber ich kann den Text nicht in das Objekt einlesen (verständliches Format). Beispiel: HttpResponseMessage response = wc.GetAsync(URI).Result; var contents = response.Content.ReadAsStringAsync(); Hier contentsenthält die Variable einige zufällige Daten anstelle der erforderlichen Daten.
Krish
79

Die akzeptierte Antwort entsorgt WebResponseden Text nicht richtig oder dekodiert ihn nicht . Außerdem gibt es in .NET 4.5 eine neue Möglichkeit, dies zu tun.

Gehen Sie wie folgt vor, um ein HTTP-GET durchzuführen und den Antworttext zu lesen.

.NET 1.1 - 4.0

public static string GetResponseText(string address)
{
    var request = (HttpWebRequest)WebRequest.Create(address);

    using (var response = (HttpWebResponse)request.GetResponse())
    {
        var encoding = Encoding.GetEncoding(response.CharacterSet);

        using (var responseStream = response.GetResponseStream())
        using (var reader = new StreamReader(responseStream, encoding))
            return reader.ReadToEnd();
    }
}

.NET 4.5

private static readonly HttpClient httpClient = new HttpClient();

public static async Task<string> GetResponseText(string address)
{
    return await httpClient.GetStringAsync(address);
}
Sam
quelle
Ich nehme an, Sie sollten durch "http://google.com"den Parameternamen ersetzen address?
Ian Boyd
Ich mag diese Antwort sehr. Es ist so prägnant und auf den Punkt. Und es handhabt die Codierung richtig; im Gegensatz zu der akzeptierten Antwort. Es zeigt auch, wie auf den Antworttext zugegriffen werden kann , auch im Gegensatz zur akzeptierten Antwort.
Ian Boyd
Dieser Code führt zu einem Deadlock für mich, wie unter stackoverflow.com/a/10369275/1636247 beschrieben . Es benötigt .GetStringAsync (Adresse) .ConfigureAwait (false); bevor es funktioniert.
Harmen
10

Ich habe das gerade selbst versucht und es gab mir eine 200 OK Antwort, aber keinen Inhalt - die Inhaltslänge war 0. Sind Sie sicher , dass es Ihnen Inhalt gibt? Wie auch immer, ich gehe davon aus, dass Sie wirklich zufrieden sind.

Um den eigentlichen Text zurückzubekommen, muss man die Codierung kennen, was schwierig sein kann. Es sollte sich im Content-Type-Header befinden, aber dann müssen Sie es analysieren usw.

Wenn dies jedoch tatsächlich XML ist (z. B. von " http://google.com/xrds/xrds.xml "), ist es viel einfacher. Laden Sie einfach das XML in den Speicher, z. B. über LINQ to XML. Zum Beispiel:

using System;
using System.IO;
using System.Net;
using System.Xml.Linq;
using System.Web;

class Test
{
    static void Main()
    {
        string url = "http://google.com/xrds/xrds.xml";
        HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);

        XDocument doc;
        using (WebResponse response = request.GetResponse())
        {
            using (Stream stream = response.GetResponseStream())
            {
                doc = XDocument.Load(stream);
            }
        }
        // Now do whatever you want with doc here
        Console.WriteLine(doc);
    }   
}

Wenn der Inhalt von XML ist, immer das Ergebnis in ein XML - Objektmodell (ob es XDocument, XmlDocumentoder XmlReader) wird wahrscheinlich mehr wert sein als den Klartext mit.

Jon Skeet
quelle
Prost. Genau das, wonach ich gesucht habe.
Nollaig
Müssen Sie den Stream auf Null prüfen? (Resharper Empfehlung)
Coops
Hm, es ist auch nicht klar, wie man die dekompilierte Methode betrachtet. Schätze, überprüfe sie aus Sicherheitsgründen auf Null
Coops
1
@ CodeBlend: Und was machen? Wenn es eine erwartete Situation ist, würde ich wollen , eine Ausnahme werfen ... das , was passieren wird, wenn Sie passieren nullzu XDocument.Loadwie auch immer, so gibt es IMO keinen Nutzen. Ich bin im Allgemeinen kein Fan davon, Dinge zu überprüfen, "nur für den Fall, obwohl ich nicht glaube, dass es dies jemals tun könnte". Es gibt eine Zeit und einen Ort dafür, aber wenn Sie diesen Ansatz für jede Methode wählen, kommt es zu einem schrecklichen Durcheinander.
Jon Skeet
2
@CodeBlend: Nun wieder, was würden Sie tun , wenn Sie überprüft und festgestellt , es war null? In den meisten Fällen können Sie grundsätzlich nicht fortfahren, daher möchten Sie eine Ausnahme auslösen, die besagt, dass etwas unerwartet null war - und genau das tun NullReferenceException oder ArgumentNullException für Sie ...
Jon Skeet
2
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.google.com");
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string strResponse = reader.ReadToEnd();
Châu Nguyễn
quelle
Die anderen Antworten beziehen sich bereits auf diese Art und Weise. Ich glaube auch nicht, dass dies die richtige Codierung verwendet, um den Text zu decodieren.
Sam
2

Dieser Artikel bietet einen guten Überblick über die Verwendung des HttpWebResponse-Objekts: Verwendung von HttpWebResponse

Relevante Bits unten:

HttpWebResponse webresponse;

webresponse = (HttpWebResponse)webrequest.GetResponse();

Encoding enc = System.Text.Encoding.GetEncoding(1252);
StreamReader loResponseStream = new StreamReader(webresponse.GetResponseStream(),enc);

string Response = loResponseStream.ReadToEnd();

loResponseStream.Close();
webresponse.Close();

return Response;
CubanX
quelle
Wenn ein Webserver die Windows-Codepage 1252 als Codierung verwendet, ist es ein trauriger Tag :( Sie sollten ihn aus der Antwort entnehmen ... was schwierig ist. Eine Lösung finden Sie in meinem speziellen Fall in meiner Antwort.
Jon Skeet
Doh! Nicht mein Code :) Es ist aus dem Artikel, ich habe nur versucht zu helfen, indem ich ihm eine Verknüpfung zu den relevanten Teilen gegeben habe. Gefahr der Fahrt durch Hilfe :)
CubanX
1

response.GetResponseStream()sollte verwendet werden, um den Antwortstrom zurückzugeben. Und vergessen Sie nicht closedie Streamund ResponseObjekte.

Decyklon
quelle
0

Wenn Sie http Anfrage ist Post und request.Accept = "application/x-www-form-urlencoded"; dann denke ich, können Sie Text der Antwort durch Code unten erhalten:

var contentEncoding = response.Headers["content-encoding"];
                        if (contentEncoding != null && contentEncoding.Contains("gzip")) // cause httphandler only request gzip
                        {
                            // using gzip stream reader
                            using (var responseStreamReader = new StreamReader(new GZipStream(response.GetResponseStream(), CompressionMode.Decompress)))
                            {
                                strResponse = responseStreamReader.ReadToEnd();
                            }
                        }
                        else
                        {
                            // using ordinary stream reader
                            using (var responseStreamReader = new StreamReader(response.GetResponseStream()))
                            {
                                strResponse = responseStreamReader.ReadToEnd();
                            }
                        }
Chung Nguyen
quelle