为什么HttpWebResponse返回一个以空字符结尾的字符串?

时间:2010-08-16 21:00:59

标签: c# httpwebrequest

我最近使用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 个答案:

答案 0 :(得分:3)

这绝对不是正常行为。两个选项:

  • 你在阅读代码中犯了一个错误(例如创建一个缓冲区然后在流上调用Read,期望它填充缓冲区)
  • Web服务器实际上返回了以空值终止的响应

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

答案 1 :(得分:2)

嗯...我怀疑它返回一个以null结尾的字符串,因为C#中根本就没有这样的概念。最好你可以在最后有一个带有\0u0000字符的字符串,但在这种情况下,这意味着从服务器返回包含这样的字符,而HttpWebRequest只是做它的职责并返回服务器返回的任何内容

<强>更新

在阅读完代码之后,错误很明显:你是Read() - 从一个流到一个字节[]但没有注意到你实际阅读了多少:< / p>

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

答案 2 :(得分:2)

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

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

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