2014-01-21 68 views
0

HttpWebResponse :: GetResponseStream()保證獲取HTTP響應中包含的所有數據嗎?或者我是否需要創建某種循環並等待以確保所有數據都是從連接的服務器發送的?下面的代碼成功地抓住了大約50%的時間。使用HttpWebResponse :: GetResponseStream方法時接收不完整的數據

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://JohnDoeServerSite.com"); 
    req.Method = "POST"; 
    req.ContentType = @"text/xml; charset=utf-8"; 
    req.Host = "http://JohnDoeServerSite.com"; 
    req.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1)"; 
    using (StreamWriter sw = new StreamWriter(req.GetRequestStream())) 
    { 
     sw.Write(xml); 
    } 
    string result; 
    using (HttpWebResponse res = (HttpWebResponse)req.GetResponse()) 
    using (Stream st = res.GetResponseStream()) 
    { 
     Thread.Sleep(10000); // Added to see if additional data would be sent (perhaps?) 
     using (StreamReader sr = new StreamReader(st, Encoding.UTF8)) 
     { 
      st.Flush(); 
      result = sr.ReadToEnd(); 
     } 
    } 
+1

理論上它應該返回所有內容。也許,如果網絡服務器的迴應有些奇怪,可能會導致它失敗,但這不太可能。在你的代碼中,我將刪除Thread.Sleep和st.Flush(),因爲那些是不必要的,甚至是不好的(在Thread.Sleep的情況下) –

+1

'Thread.Sleep(..)'不是必需的,流將根據傳輸確認合適的'EOF'(文件結束)標記。如果有更多數據要通過網絡讀取,則流讀取將被阻止。當你說「成功抓住迴應」時,你是什麼意思?流只是空的?你應該檢查'res.StatusCode',也許服務器正在響應404,500或其他錯誤? – Snixtor

+1

'GetResponseStream'不返回任何數據。它返回一個'Stream'。可以讀取「流」來獲取所有數據。沒有隱藏的數據,也沒有必要從「Stream」中「哄騙」數據。 –

回答

0

經過深入研究,發現服務器並未完整發送所有數據。 Michael Yoon似乎是對的,說一切都應該歸還。

相關問題