我最近使用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);
答案 0 :(得分:3)
这绝对不是正常行为。两个选项:
Read
,期望它填充缓冲区)如果没有别的话,您应该能够使用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();
//...
}