【问题标题】:Why does HttpWebResponse return a null terminated string?为什么 HttpWebResponse 返回一个以空字符结尾的字符串?
【发布时间】:2010-08-16 21:00:59
【问题描述】:

我最近使用 HttpWebResponse 从 HttpWebRequest 返回 xml 数据,我注意到该流向我返回了一个以 null 结尾的字符串。

我认为是因为底层库必须与 C++ 兼容,但我无法找到提供进一步说明的资源。

主要是我想知道是否有一种简单的方法可以禁用此行为,这样我就不必清理传递给我的 xml 阅读器的字符串。


此处编辑是相关代码的示例:

httpResponse.GetResponseStream().Read(serverBuffer, 0, BUFFER_SIZE);
output = processResponse(System.Text.UTF8Encoding.UTF8.GetString(serverBuffer))

processResponse 的样子:

 processResponse(string xmlResponse)
 {
     var Parser = new XmlDocument();
     xmlResponse = xmlResponse.Replace('\0',' '); //fix for httpwebrequest null terminating strings
     Parser.LoadXml(xmlResponse);

【问题讨论】:

  • 能否请您展示您的代码,因为我过去已成功使用过此代码,无需将字符串清理到 XML 解析器中。
  • 我现在看到,我的 UTF8 编码返回空字节的空值,因为我的缓冲区比我的读取大

标签: c# httpwebrequest


【解决方案1】:

这绝对不是正常行为。两种选择:

  • 您在读取代码时出错(例如,创建缓冲区,然后在流上调用 Read,期望它填充缓冲区)
  • Web 服务器实际上返回了一个空终止响应

如果没有别的,您应该能够使用Wireshark 来区分。

【讨论】:

    【解决方案2】:

    可能是您正在为正在加载的缓冲区设置大小(错误大小)?

    如果不需要,可以使用 StreamReader 来避免临时缓冲区。

    using(var stream = new StreamReader(httpResponse.GetResponseStream()))
    {
      string output = stream.ReadToEnd();
    //...
    }
    

    【讨论】:

      【解决方案3】:

      嗯...我怀疑它返回一个以空字符结尾的字符串,因为在 C# 中根本没有这样的概念。充其量你可以在末尾有一个带有\0u0000 字符的字符串,但在这种情况下,这意味着来自服务器的返回包含这样一个字符,而 HttpWebRequest 只是在履行职责并返回服务器返回的任何内容。

      更新

      阅读您的代码后,错误非常明显:您正在 Read()-ing 从一个流到一个字节[],但没有注意到您实际阅读了多少

      int responseLength = httpResponse.GetResponseStream().Read(
          serverBuffer, 0, BUFFER_SIZE);
      output = processResponse(System.Text.UTF8Encoding.UTF8.GetString(
          serverBuffer, 0, responseLength));
      

      这将解决直接的问题,只留下代码中的其他错误需要处理,例如您无法正确处理大于 BUFFER_SIZE 的响应的事实...我建议您打开 XML 文档阅读器 在返回的流上而不是通过(不必要的)字节[]复制操作来操作流:

      Parser.Load(httpResponse.GetResponseStream());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-05
        • 1970-01-01
        • 2013-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-12
        • 2013-10-22
        相关资源
        最近更新 更多