为什么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);
答
难道说你的尺寸(错误大小)设定为与要装入的缓冲器?
如果您不需要它,您可以使用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());
您可以请您展示您的代码,因为我以前成功地使用了这个代码,而无需将字符串清理到XML解析器中。 – Lazarus 2010-08-16 21:02:16
我现在看到,我的UTF8编码正在为空字节返回空值,因为我的缓冲区比我读的大 – tzenes 2010-08-16 21:46:01