为什么HttpWebResponse返回空终止的字符串?

问题描述:

我最近使用HttpWebResponse从HttpWebRequest返回xml数据,并且我注意到流向我返回了一个以null结尾的字符串。为什么HttpWebResponse返回空终止的字符串?

我假设它是因为底层库必须与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); 
+1

您可以请您展示您的代码,因为我以前成功地使用了这个代码,而无需将字符串清理到XML解析器中。 – Lazarus 2010-08-16 21:02:16

+0

我现在看到,我的UTF8编码正在为空字节返回空值,因为我的缓冲区比我读的大 – tzenes 2010-08-16 21:46:01

难道说你的尺寸(错误大小)设定为与要装入的缓冲器?

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

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

这肯定是不正常的行为。有两个选项:

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

如果没有其他问题,您应该可以使用Wireshark来区分差异。

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

更新

阅读你的代码后,错误是很明显的:你是从Read()流-ing成一个byte []而不是套结的你居然读了多少通知:

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