【问题标题】:Incomplete HttpWebResponse with large data sets具有大型数据集的不完整 HttpWebResponse
【发布时间】:2011-07-18 20:58:02
【问题描述】:

我有一些代码可以下载我已经使用了一段时间的网页内容。此代码工作正常,从未提供过问题,但仍然没有......但是,有一个相当大的页面(2MB,无图像)有 4 个表,分别有 4、20、100、600 行和大约 20列宽。

当尝试获取所有数据时,它在没有任何明显错误或异常的情况下完成,但仅返回第 4 个表中的第 60 行左右 - 有时更多,有时更少。浏览器在大约 20 到 30 秒内完成加载,并持续(看起来像是刷新)到页面直到完成。

我尝试了 SO 的多种解决方案,并进行了搜索,但没有任何不同的结果。以下是当前代码,但我有:代理、异步、无超时、错误的保活...

我不能使用 WebClient(作为另一个远程尝试),因为我需要使用 cookiecontainer 登录。

        HttpWebRequest pageImport = (HttpWebRequest)WebRequest.Create(importUri);
        pageImport.ReadWriteTimeout = Int32.MaxValue;
        pageImport.Timeout = Int32.MaxValue;
        pageImport.UserAgent = "User-Agent  Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3";
        pageImport.Accept = "Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        pageImport.KeepAlive = true;
        pageImport.Timeout = Int32.MaxValue;
        pageImport.ReadWriteTimeout = Int32.MaxValue;
        pageImport.MaximumResponseHeadersLength = Int32.MaxValue;

        if (null != LoginCookieContainer)
        {
            pageImport.CookieContainer = LoginCookieContainer;
        }

        Encoding encode = System.Text.Encoding.GetEncoding("utf-8");


        using (WebResponse response = pageImport.GetResponse())
        using (Stream stream = response.GetResponseStream())
        using (StreamReader reader = new StreamReader(stream, encode))
        {
            stream.Flush();
            HtmlRetrieved = reader.ReadToEnd();
        }

【问题讨论】:

    标签: c# .net httpwebrequest screen-scraping httpwebresponse


    【解决方案1】:

    尝试逐块读取而不是 reader.ReadToEnd(); 只是给你一个想法:

    // 将流传输到具有所需编码格式的更高级别的流阅读器。 StreamReader readStream = new StreamReader( ReceiveStream, encode ); Console.WriteLine("\n收到响应流"); 字符 [] 读取 = 新字符 [256];

        // Read 256 charcters at a time.    
     int count = readStream.Read( read, 0, 256 );
        Console.WriteLine("HTML...\r\n");
    
    while (count > 0) 
    {
            // Dump the 256 characters on a string and display the string onto the console.
        String str = new String(read, 0, count);
        Console.Write(str);
        count = readStream.Read(read, 0, 256);
    }
    

    【讨论】:

      【解决方案2】:

      我怀疑这是作为服务器端的配置设置处理的。顺便说一句,我认为您可能错误地设置了属性。从文字中删除“user-agent”和“accept”,如下所示:

      pageImport.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3";         
      pageImport.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";      
      

      【讨论】:

        【解决方案3】:

        虽然我仍然会尝试提供的建议,如果可行,我会更改我的答案,但在这种情况下,问题似乎在于代理。我走到了代理前面,代码按预期运行,而且速度更快。

        我得看看一些代理优化,因为这段代码必须在代理后面运行。

        【讨论】:

          猜你喜欢
          • 2013-12-21
          • 2015-07-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-17
          • 1970-01-01
          相关资源
          最近更新 更多