繁体   English   中英

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

[英]Why does HttpWebResponse return a null terminated string?

我最近使用HttpWebResponse从HttpWebRequest返回xml数据,我注意到该流向我返回了一个以null终止的字符串。

我之所以这样认为是因为底层库必须与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);

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

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

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

嗯...我怀疑它是否返回以Null结尾的字符串,因为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());

可能是您正在设置要加载的缓冲区的大小(错误的大小)吗?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM