2011-02-07 14 views
9

Por alguna razón, más allá de mi comprensión, las solicitudes realizadas a un sitio web particular (https://learningnetwork.cisco.com/people/mrollins?view=profile) dan como resultado un objeto-respuesta cuya versión de respuesta contiene una versión truncada del sitio web.System.Net.HttpWebResponse.GetResponseStream() devuelve el cuerpo truncado en WebException

La secuencia finaliza después de 65536 bytes, lo que equivale a 2^16 bytes. Considero que es un número sospechosamente redondo. Las solicitudes se quejan de un error interno del servidor, que compruebo, porque ya he verificado que los navegadores web pueden dar sentido a esta respuesta, y que el html completo está incluido en la respuesta del servidor. (Usando fiddler)

que he encontrado el problema previamente documentado here, lo que no es satisfactorio por la sencilla razón de que finaliza en esta nota:

"Creo que voy a tener que esperar el error no excede 65536 caracteres ... "

Bueno, sí.

Se agradecen las soluciones, o si alguien sabe de una corrección que también es buena.

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

Debí haber incluido algunos comentarios sobre el código. Es un programa tan simple como he podido hacer, que aún demuestra el problema. Para ver el problema, coloque un punto de interrupción al final de la cláusula catch y observe que solo se han leído 2^16 bytes. (wronglength = 65536) – Tor

Respuesta

15

HttpWebRequest tiene una propiedad estática que limita la longitud de las solicitudes web. esta línea de código, insertada antes de que se realice la solicitud, resuelve el problema.

HttpWebRequest.DefaultMaximumErrorResponseLength = 1048576;