.net 读取GetResponseStream()的最佳方式是什么?

.net 读取GetResponseStream()的最佳方式是什么?,.net,http,stream,getresponsestream,.net,Http,Stream,Getresponsestream,从GetResponseStream读取HTTP响应的最佳方式是什么 目前我正在使用以下方法 Using SReader As StreamReader = New StreamReader(HttpRes.GetResponseStream) SourceCode = SReader.ReadToEnd() End Using 我不确定这是否是读取http响应的最有效方法 我需要以字符串的形式输出,我已经看到了一个不同的方法,但我不太清楚它是否是一个好的方法。在我的测试中,代码在不同的

从GetResponseStream读取HTTP响应的最佳方式是什么

目前我正在使用以下方法

Using SReader As StreamReader = New StreamReader(HttpRes.GetResponseStream)
   SourceCode = SReader.ReadToEnd()
End Using
我不确定这是否是读取http响应的最有效方法

我需要以字符串的形式输出,我已经看到了一个不同的方法,但我不太清楚它是否是一个好的方法。在我的测试中,代码在不同的网站上有一些编码问题


如何阅读web响应?

我使用类似的方法从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;
}
您忘记定义“缓冲区”和“totalBytesRead”:


也许你可以看看这个班。以下是一个例子:

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

我对字符串的简单处理方法。注意
StreamReader
构造函数上的
true
第二个参数。这告诉它从字节顺序标记检测编码,并可能有助于解决您遇到的编码问题

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

在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

我面临着类似的情况:

我试图使用BasicHTTPBinding读取原始响应,以防在使用SOAP服务时出现HTTP错误

但是,当使用
GetResponseStream()
读取响应时,出现错误:

流不可读

所以,这个代码对我来说很有用:

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

我觉得你的方式还不错。看起来没什么问题。顺便说一句,informit中的代码是有缺陷的。Read()并不意味着你已经阅读了所有的响应,因此它会失败。我希望我知道这个问题的答案。我正试图在Android上做到这一点,因为我的实现速度非常慢。在Android上,您甚至没有ReadToEnd()。对于传输二进制数据(如图片),使用StreamReader/string并在之后转换为字节数组是否效率低下?要避免在从流读取时处理缓冲区大小调整(vs StreamReader)?即使对于较小的传输(<1Mb),这也是一种糟糕的编码实践。二进制数据的最佳响应编码是什么(与UTF-8相比,ASCII转换为字节数组是否最有效)?谢谢。回答:当然,将MemoryStream与StreamReader.ReadToEnd()结合使用,只需解码AlreadCycloseStream.ToArray()中的UTF8字符串即可。但是
rawResponse=System.Text.Encoding.UTF8.GetString(alreadcyclosedstream.ToArray())
也是如此,而且它更简单,更容易阅读……;)
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();
}