【问题标题】:How to convert WebResponse.GetResponseStream return into a string?如何将 WebResponse.GetResponseStream 返回转换为字符串?
【发布时间】:2018-01-15 21:40:37
【问题描述】:

我看到了很多示例,但它们都将它们一次读入字节数组或 256 个字符,速度很慢。为什么?

将生成的Stream 值转换为我可以解析的字符串是否不可取?

【问题讨论】:

    标签: c# .net string httpwebresponse


    【解决方案1】:

    你可以使用StreamReader.ReadToEnd()

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

    【讨论】:

    • @FaizanMubasher - 我想推荐 LINQ To XML。
    • 您指出StreamReader 采用第二个参数Encoding.UTF8 很好。起初在查看 MS 文档时没有注意到这一点
    • 编码是不是应该基于response.CharacterSet的值而不是假设UTF8的固定值?
    • LINQ To XML 示例?
    • GetResponse and GetResponseStream 可以抛出异常
    【解决方案2】:

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

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

    【讨论】:

    • 感谢 SLaks,现在检查 DownloadString。实际上,与使用 Winforms 浏览器控件的 browser.DocumentStream 的旧应用程序相比,我得到了不同的源代码字符串。你认为 DownloadString 会解决它吗?如果它不那么简单,我可以创建一个新问题。
    • 您要么有编码问题,要么需要设置User-Agent
    • 感谢 SLaks,我现在使用 DownloadString,最好你是对的。现在结果略有不同,应该没什么区别,但我得到了像<a href= 这样的东西,而不是旧的<A href=。这仍然与编码或User-Agent有关吗?
    • 听起来很奇怪;它可能会被 IE 标准化。
    • WebClientHttpWebRequest 使用原始 HTTP,不涉及浏览器。如果不同的浏览器显示不同的查看源代码,这是User-Agent 问题。
    【解决方案3】:

    正如@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)
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

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

      StreamReader responseReader = new StreamReader(request.GetResponse().GetResponseStream());
      var responseData = responseReader.ReadToEnd();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多