2008-09-26 14 views
21

Wie liest man am besten eine HTTP-Antwort von GetResponseStream?Wie liest man GetResponseStream() am besten?

Derzeit verwende ich den folgenden Ansatz.

Ich bin nicht ganz sicher, ob dies der effizienteste Weg ist, eine HTTP-Antwort zu lesen.

Ich brauche den Ausgang als String, ich habe eine article mit einem anderen Ansatz gesehen, aber ich bin nicht ganz, wenn es ein gutes ist. Und in meinen Tests hatte dieser Code einige Codierungsprobleme in verschiedenen Websites.

Wie liest du Webantworten?

+3

Ihr Weg zu mir ok scheint. IOW nichts falsch damit. – leppie

+0

BTW-Code in Informit ist fehlerhaft wie ein .Read() bedeutet nicht, dass Sie alle Antworten gelesen haben, daher wird es fehlschlagen. –

+0

Ich wünschte, ich wüsste die Antwort darauf. Ich versuche, dies auf Android richtig zu machen, weil meine Implementierung extrem langsam ist. Unter Android erhalten Sie nicht einmal ReadToEnd(). –

Antwort

15

ich so etwas wie diese verwenden, um eine Datei von einer URL heruntergeladen werden:

if (!Directory.Exists(localFolder)) 
{ 
    Directory.CreateDirectory(localFolder); 
} 


try 
{ 
    HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(Path.Combine(uri, filename)); 
    httpRequest.Method = "GET"; 

    // if the URI doesn't exist, an exception will be thrown here... 
    using (HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse()) 
    { 
     using (Stream responseStream = httpResponse.GetResponseStream()) 
     { 
      using (FileStream localFileStream = 
       new FileStream(Path.Combine(localFolder, filename), FileMode.Create)) 
      { 
       var buffer = new byte[4096]; 
       long totalBytesRead = 0; 
       int bytesRead; 

       while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0) 
       { 
        totalBytesRead += bytesRead; 
        localFileStream.Write(buffer, 0, bytesRead); 
       } 
      } 
     } 
    } 
} 
catch (Exception ex) 
{ 
    // You might want to handle some specific errors : Just pass on up for now... 
    // Remove this catch if you don't want to handle errors here. 
    throw; 
} 
3

Sie haben vergessen „Puffer“ und „totalBytesRead“ zu definieren:

using (FileStream localFileStream = .... 
{ 
    byte[] buffer = new byte[ 255 ]; 
    int bytesRead; 
    double totalBytesRead = 0; 

    while ((bytesRead = .... 
13

Vielleicht könnten Sie die WebClient Blick in Klasse. Hier ist ein Beispiel:

using System.Net; 

namespace WebClientExample 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var remoteUri = "http://www.contoso.com/library/homepage/images/"; 
      var fileName = "ms-banner.gif"; 
      WebClient myWebClient = new WebClient(); 
      myWebClient.DownloadFile(remoteUri + fileName, fileName); 
     } 
    } 
} 
11

Meine einfache Art, es zu einer Zeichenfolge zu tun. Beachten Sie den zweiten Parameter true auf dem StreamReader-Konstruktor. Dies weist darauf hin, dass die Codierung von den Byte-Reihenfolge-Marken erkannt wird und möglicherweise auch bei dem Codierungsproblem hilft, das Sie erhalten.

string target = string.Empty; 
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=583"); 

HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse(); 
try 
{ 
    StreamReader streamReader = new StreamReader(response.GetResponseStream(),true);     
    try 
    { 
    target = streamReader.ReadToEnd(); 
    } 
    finally 
    { 
    streamReader.Close(); 
    } 
} 
finally 
{ 
    response.Close(); 
} 
+0

Ist es für die Übertragung von Binärdaten (wie Bildern) ineffizient, StreamReader/string zu verwenden und danach in ein Byte-Array umzuwandeln? Möchten Sie vermeiden, dass beim Lesen aus einem Stream (vs StreamReader) die Puffergröße verändert wird? Wäre dies eine schlechte Programmierpraxis, selbst für kleine Übertragungen (<1 MB). Was wäre die beste Antwortcodierung für binäre Daten (wäre ASCII am effizientesten in ein Byte-Array zu konvertieren, sagen wir UTF-8)? Vielen Dank. – samosaris

+0

** Antwort: ** http: // stackoverflow.com/questions/5867227/convert-streamreader-to-byte – samosaris

6

In Powershell, habe ich diese Funktion:

function GetWebPage 
{param ($Url, $Outfile) 
    $request = [System.Net.HttpWebRequest]::Create($SearchBoxBuilderURL) 
    $request.AuthenticationLevel = "None" 
    $request.TimeOut = 600000  #10 mins 
    $response = $request.GetResponse() #Appending "|Out-Host" anulls the variable 
    Write-Host "Response Status Code: "$response.StatusCode 
    Write-Host "Response Status Description: "$response.StatusDescription 
    $requestStream = $response.GetResponseStream() 
    $readStream = new-object System.IO.StreamReader $requestStream 
    new-variable db | Out-Host 
    $db = $readStream.ReadToEnd() 
    $readStream.Close() 
    $response.Close() 
    #Create a new file and write the web output to a file 
    $sw = new-object system.IO.StreamWriter($Outfile) 
    $sw.writeline($db) | Out-Host 
    $sw.close() | Out-Host 
} 

Und ich nenne es wie folgt aus:

$SearchBoxBuilderURL = $SiteUrl + "nin_searchbox/DailySearchBoxBuilder.asp" 
$SearchBoxBuilderOutput="D:\ecom\tmp\ss2.txt" 
GetWebPage $SearchBoxBuilderURL $SearchBoxBuilderOutput 
1

ich eine ähnliche Situation konfrontiert:

Ich habe versucht, zu Bei einem HTTP-Fehler, der einen SOAP-Service unter Verwendung von BasicHTTPBinding verbraucht, wird eine rohe Antwort gelesen.

Wenn jedoch die Antwort mit GetResponseStream() Lesen, bekam den Fehler:

Stream not readable

Also, dieser Code für mich gearbeitet:

try 
{ 
    response = basicHTTPBindingClient.CallOperation(request); 
} 
catch (ProtocolException exception) 
{ 
    var webException = exception.InnerException as WebException; 

    var alreadyClosedStream = webException.Response.GetResponseStream() as MemoryStream; 
    using (var brandNewStream = new MemoryStream(alreadyClosedStream.ToArray())) 
    using (var reader = new StreamReader(brandNewStream)) 
     rawResponse = reader.ReadToEnd(); 
} 
+0

Sicher, mit einem MemoryStream in Verbindung mit StreamReader.ReadToEnd(), nur um die UTF8-Zeichenfolge von amoClosedStream.ToArray() zu dekodieren funktioniert. Aber so ist 'rawResponse = System.Text.Encoding.UTF8.GetString (amoClosedStream.ToArray())', und es ist viel einfacher und einfacher zu lesen ...;) – elgonzo

Verwandte Themen