代码之家  ›  专栏  ›  技术社区  ›  tzenes

为什么httpWebResponse返回以空结尾的字符串?

  •  0
  • tzenes  · 技术社区  · 16 年前

    我最近使用httpwebresponse从httpwebrequest返回XML数据,我注意到流向我返回了一个以空结尾的字符串。

    我假设它是因为底层库必须与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);
    
    3 回复  |  直到 15 年前
        1
  •  2
  •   Peter Hosey    15 年前

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

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

    using(var stream = new StreamReader(httpResponse.GetResponseStream()))
    {
      string output = stream.ReadToEnd();
    //...
    }
    
        2
  •  3
  •   Jon Skeet    16 年前

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

    • 您在读取代码时出错(例如,创建缓冲区,然后调用 Read 在流上,期望它填满缓冲区)
    • Web服务器 事实上 返回以空结尾的响应

    你应该能够用 Wireshark 如果没有别的。

        3
  •  2
  •   Remus Rusanu    16 年前

    隐马尔可夫模型。。。我怀疑它返回一个以空结尾的字符串,因为在C中没有这样的概念。最多你可以用一根绳子 \0u0000 字符结尾,但在本例中,这意味着从服务器返回的内容包含这样一个字符,而httpwebrequest只是执行它的职责,返回服务器返回的内容。

    更新

    在阅读了你的代码之后,错误是显而易见的:你是 Read() -从流到字节[]但不附加 你读了多少书 :

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

    这将解决当前的问题,只留下代码中其他要处理的错误,例如您无法正确处理大于 BUFFER_SIZE …我建议您打开一个XML文档阅读器 在返回的流上 而不是通过(不必要的)byte[]复制操作来操作流:

    Parser.Load(httpResponse.GetResponseStream());