System.Net.HttpWebResponse.GetResponseStream() 在 WebException 中返回截断的正文

Posted

技术标签:

【中文标题】System.Net.HttpWebResponse.GetResponseStream() 在 WebException 中返回截断的正文【英文标题】:System.Net.HttpWebResponse.GetResponseStream() returns truncated body in WebException 【发布时间】:2011-02-07 04:41:02 【问题描述】:

由于某些超出我理解的原因,对特定网站 (https://learningnetwork.cisco.com/people/mrollins?view=profile) 的请求会导致一个 reqsponse-object,其响应流包含该网站的中继版本。

流在 65536 字节后结束,等于 2^16 字节。我认为这是一个可疑的整数。这些请求抱怨内部服务器错误,我对此感到不满,因为我已经验证了网络浏览器能够理解此响应,并且完整的 html 包含在来自服务器的响应中。 (使用fiddler)

我发现了之前记录的问题here,这并不令人满意,原因很简单,它以这个注释结束:

“我想我将不得不希望错误 不超过 65536 个字符..."

确实如此。

感谢解决方法,或者如果有人知道即将发布的修复也很好。

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;
        
    

【问题讨论】:

我应该包含一些关于代码的 cmets。这是我能够制作的最简单的程序,它仍然证明了这个问题。要查看问题,请在 catch 子句末尾放置一个断点,并观察仅读取了 2^16 个字节。 (错误长度 = 65536) 【参考方案1】:

HttpWebRequest 具有限制 Web 请求长度的静态属性。在发出请求之前插入的这行代码解决了问题。

HttpWebRequest.DefaultMaximumErrorResponseLength = 1048576;

【讨论】:

以上是关于System.Net.HttpWebResponse.GetResponseStream() 在 WebException 中返回截断的正文的主要内容,如果未能解决你的问题,请参考以下文章