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

87

我看到很多例子但是它们都会一次读入一个字节数组或256个字符,速度较慢。为什么呢?

直接将结果 Stream 值转换成字符串来解析不可行吗?

5个回答

151
你可以使用StreamReader.ReadToEnd()
using (Stream stream = response.GetResponseStream())
{
   StreamReader reader = new StreamReader(stream, Encoding.UTF8);
   String responseString = reader.ReadToEnd();
}

1
@FaizanMubasher - 我想建议使用 LINQ To XML。 - KV Prajapati
2
很棒,你指出了 StreamReader 接受第二个参数 Encoding.UTF8。在查看微软文档时一开始没有注意到这一点。 - newprint
5
编码不应该基于假定的UTF8固定值,而应该基于响应中的response.CharacterSet值。 - Heinzi
LINQ To XML 的示例? - PreguntonCojoneroCabrón
GetResponseGetResponseStream可能会抛出异常。 - PreguntonCojoneroCabrón

61

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

你应该考虑调用WebClient.DownloadString


1
谢谢SLaks,我现在正在检查DownloadString。实际上,我得到的源代码字符串与我的旧应用程序不同,旧应用程序使用Winforms浏览器控件中的browser.DocumentStream。你认为DownloadString会解决这个问题吗?如果不是那么简单,我可以创建一个新的问题。 - Joan Venge
5
你可能存在编码问题,或者需要设置一个“User-Agent”。 - SLaks
2
这听起来很奇怪;可能需要用 IE 进行规范化。 - SLaks
谢谢SLaks,我注意到IE、chrome和FF都会给出略微不同的结果。所以DownloadString仍然在后台使用IE吗?或者有更直接、不依赖IE的方法吗? - Joan Venge
3
WebClientHttpWebRequest使用原始HTTP协议,不涉及浏览器。如果不同的浏览器显示不同的"查看源代码"(View Source)结果,则可能是由于User-Agent的问题造成的。 - SLaks
显示剩余2条评论

14

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

这应该是被接受的答案。有一个小错误,将response.CharacterSet == ""更改为string.IsNullOrEmpty(response.CharacterSet)。 - nivs1978

5

Richard Schneider是正确的。 使用下面的代码从非UTF8字符集的站点获取数据会得到错误的字符串。

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

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

2
你可以在流周围创建一个StreamReader,然后调用StreamReader.ReadToEnd()
StreamReader responseReader = new StreamReader(request.GetResponse().GetResponseStream());
var responseData = responseReader.ReadToEnd();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接