2011-02-07 60 views
9

由於某些原因,我無法理解對某個特定網站(https://learningnetwork.cisco.com/people/mrollins?view=profile)的請求,從而產生響應流包含網站的主幹版本的請求響應對象。System.Net.HttpWebResponse.GetResponseStream()在WebException中返回截斷主體

流在65536字節後結束,等於2^16字節。我認爲這是一個可疑的數字。這些請求會抱怨內部服務器錯誤,這是我壓制的原因,因爲我已經驗證了webbrowser能夠理解此響應,並且完整的html包含在服務器的響應中。 (使用fiddler

我發現以前記錄here的問題,這是不能令人滿意的,原因很簡單,它在這張票據結束:

「我想我得希望錯誤 不超過65536個字符...「

那好吧。

解決方法讚賞,或者如果有人知道一個upcomming修復也是好的。

using System; 
using System.IO; 
using System.Net; 
using System.Web.UI; 

namespace Example 
{ 
    public partial class _Default : Page 
    { 
     protected void Page_Load(object senderHidden, EventArgs eHidden) 
     { 
      //ServicePointManager.ServerCertificateValidationCallback += delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; }; 
      var cookieContainer = new CookieContainer(); 
      //Encoding enc = Encoding.UTF8; 
      HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://learningnetwork.cisco.com/people/mrollins?view=profile"); 
      req.AllowAutoRedirect = false; 

      req.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; 
      req.CookieContainer = cookieContainer; 
      req.Accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; 
      req.Method = "GET"; 
      req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12"; 
      req.KeepAlive = true; 

      HttpWebResponse resp = null; 
      try 
      { 
       resp = (HttpWebResponse)req.GetResponse(); 
      } 
      catch (WebException e) 
      { 
       var r = e.Response as HttpWebResponse; 
       var memstream = Read(r.GetResponseStream()); 
       var wrongLength = memstream.Length; 
      } 
     } 

     public static MemoryStream Read(Stream stream) 
     { 
      MemoryStream memStream = new MemoryStream(); 

      byte[] readBuffer = new byte[4096]; 
      int bytesRead; 
      while ((bytesRead = stream.Read(readBuffer, 0, readBuffer.Length)) > 0) 
       memStream.Write(readBuffer, 0, bytesRead); 
      return memStream; 
     } 
    } 
} 
+0

我應該包括一些關於代碼的評論。這是一個簡單的程序,我已經能夠做出,這仍然表明了問題。要查看問題,請在catch子句末尾放置一個斷點,並觀察只讀取了2^16個字節。 (錯誤長度= 65536) – Tor 2011-02-07 09:23:43

回答

15

HttpWebRequest具有限制Web請求長度的靜態屬性。在執行請求之前插入的這行代碼解決了這個問題。

HttpWebRequest.DefaultMaximumErrorResponseLength = 1048576;