簡體   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