10

特定の Web サイト ( https://learningnetwork.cisco.com/people/mrollins?view=profile )に対して行われた私の理解を超えた何らかの理由で、応答ストリームに Web サイトのトランク化されたバージョンが含まれる reqsponse-object が生成されます。

ストリームは 65536 バイト (2^16 バイト) で終了します。私はそれが疑わしいラウンド数だと思います。要求は内部サーバー エラーを訴えますが、これは抑制します。これは、Web ブラウザーがこの応答を理解できることと、サーバーからの応答に完全な html が含まれていることの両方を既に確認しているためです。(フィドラーを使用)

以前ここに文書化された問題を見つけましたが、このメモで終わるという単純な理由で満足のいくものではありません:

「エラーが 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;
        }
    }
}
4

1 に答える 1

16

HttpWebRequest には、Web 要求の長さを制限する静的プロパティがあります。リクエストが行われる前に挿入されたこのコード行は、問題を解決します。

HttpWebRequest.DefaultMaximumErrorResponseLength = 1048576;
于 2011-02-07T09:39:51.917 に答える