如何将WebResponse.GetResponseStream返回转换为字符串?


79

我看到了许多示例,但所有示例一次都将它们缓慢地读入字节数组或256个字符。为什么?

仅将结果Stream值转换为可以解析的字符串是否明智?

Answers:


59

您应该StreamReader在流周围创建一个,然后调用ReadToEnd

您应该考虑WebClient.DownloadString改为致电。


1
感谢SLaks,现在检查DownloadString。实际上,与我的旧应用程序使用browser.DocumentStream使用Winforms Browser控件相比,我得到了不同的源代码字符串。您认为DownloadString可以解决此问题?如果不是那么简单,我可以创建一个新问题。
琼·芬格

5
您可能遇到编码问题,或者需要设置一个User-Agent
SLaks 2011年

感谢SLaks,我现在使用DownloadString,最好是正确的。现在结果略有不同,不应该有所不同,但是我得到的东西<a href=不是原来的,而是<A href=。那还是和编码有关User-Agent吗?
琼·芬格

2
这听起来很奇怪; IE可能会将其标准化。
SLaks 2011年

3
WebClientHttpWebRequest使用不涉及浏览器的原始HTTP。如果不同的浏览器显示不同的View Source,那就是一个User-Agent问题。
SLaks 2011年

141

您可以使用StreamReader.ReadToEnd()

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

1
@FaizanMubasher-我想建议LINQ To XML。
adatapost 2014年

2
您指出的伟大是StreamReader第二个参数Encoding.UTF8。刚开始查看MS文档时没有注意到这一点
newprint 2014年

5
编码不应该基于response.CharacterSet的值,而不是假定UTF8为固定值吗?
Heinzi 2015年

LINQ To XML示例?
PreguntonCojoneroCabrón

GetResponse and GetResponseStream可以抛出异常
PreguntonCojoneroCabrón

10

正如@Heinzi提到的,​​应使用响应的字符集。

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

5

理查德·施耐德(Richard Schneider)是对的。使用下面的代码从不是utf8字符集的站点获取数据将得到错误的字符串。

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

我不能投票。所以写了这个。


3

您可以StreamReader在流周围创建一个,然后调用StreamReader.ReadToEnd()

StreamReader responseReader = new StreamReader(request.GetResponse().GetResponseStream());
var responseData = responseReader.ReadToEnd();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.