2008-09-26 4 views
21

Каков наилучший способ прочитать HTTP-ответ от GetResponseStream?Каков наилучший способ прочитать GetResponseStream()?

В настоящее время я использую следующий подход.

Using SReader As StreamReader = New StreamReader(HttpRes.GetResponseStream) 
    SourceCode = SReader.ReadToEnd() 
End Using 

Я не совсем уверен, является ли это наиболее эффективным способом для чтения ответа HTTP.

Мне нужен вывод как строка, я видел article с другим подходом, но я не совсем, если он хороший. И в моих тестах код имел некоторые проблемы с кодировкой на разных сайтах.

Как вы читаете ответы в Интернете?

+3

Ваш путь кажется нормально для меня. IOW ничего плохого в этом. – leppie 2008-10-02 10:15:30

+0

Код BTW в информатике является ошибкой как один .Read() не означает, что вы прочитали весь ответ, следовательно, он потерпит неудачу. – 2011-01-04 12:37:23

+0

Хотел бы я знать ответ на этот вопрос. Я пытаюсь понять это на Android, потому что моя реализация очень медленная. На Android вы даже не получаете ReadToEnd(). – 2017-11-27 06:16:47

ответ

15

я использую что-то вроде этого, чтобы загрузить файл с URL:

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

Вы забыли определить «буфера» и «totalBytesRead»:

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

    while ((bytesRead = .... 
13

Может быть, вы могли бы смотреть в WebClient класс. Вот пример:

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

Мой простой способ сделать это с помощью строки. Обратите внимание на второй параметр true в конструкторе StreamReader. Это говорит о том, что он обнаруживает кодировку из байтов байтов и может помочь с проблемой кодирования, которую вы получаете.

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

В PowerShell, у меня есть эта функция:

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 
} 

И я называю это так:

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

Я сталкивался с подобной ситуацией:

Я пытался прочитайте необработанный ответ в случае ошибки HTTP, потребляющей SOAP-службу, с использованием функции BasicHTTPBinding.

Однако при чтении ответа, используя GetResponseStream(), получил ошибку:

Stream not readable

Таким образом, этот код работал для меня:

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(); 
} 
Смежные вопросы