частичный источник страницы из httpwebresponse

Я очень новичок в этом, поэтому прошу прощения за любое невежество.

Я создал свое первое многопоточное приложение, и его цель - сделать множество веб-запросов, проанализировать каждый источник страницы и сохранить результаты в таблицах для дальнейшего опроса. Теоретически может быть до 30-40000 запросов, поэтому необходимость в многопоточности. Каждый запрос получает поток. Я думаю, что все работает, за исключением того, что я очень часто получаю только очень частичный источник страницы. Это похоже на то, что StreamReader прерывается во время чтения ответа. Я иду в браузер с тем же запросом и получаю всю страницу. Я думал, что это может быть связано с многопоточностью, хотя я думаю, что я все еще делаю звонки синхронно (В идеале я хотел бы делать вызовы асинхронно, но я не уверен, как это сделать. ) Есть ли способ узнать, завершен ли источник страницы, чтобы определить, следует ли запрашивать снова? Я уверен, что здесь есть сложности, которые мне не хватает. Любая помощь по любому из кода будет принята с благодарностью.

Извините за форматирование. Ниже приведена часть кода для класса, который делает запросы:

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Threading;
using System.IO;
using System.Net;
using System.Text.RegularExpressions;  

namespace M4EverCrawler
{
    public class DomainRun
    {
        public void Start()
        {
            new Thread(new ThreadStart(this.Run1)).Start();  

            new Thread(new ThreadStart(this.Run2)).Start();

            new Thread(new ThreadStart(this.Run3)).Start();
        }


        public DomainRun(DNQueueManager dnq, ProxyQueueManager prxQ)
        {
            dnqManager = dnq;
            ProxyManager = prxQ;  
        }

        private DNQueueManager dnqManager;
        private ProxyQueueManager ProxyManager;
        public StagingQueue StagingQueue = new StagingQueue();
        public MetricsQueueManager MQmanager = new MetricsQueueManager();
        public CommitQueueManager CQmanager = new CommitQueueManager();


        protected void Run1()
        {
            dnqManager.LoadDNs();
            ProxyManager.LoadProxies();

            while (true)
            {
                if (dnqManager.IsDNDavailable)
                {
                    DomainData dnd = dnqManager.GetDND();
                    dnd.PageSource = CapturePage(dnd.DomainName);
                    StagingQueue.AddDN2Q(dnd);
                }
                Thread.Sleep(new Random().Next(20));
            }
        }


        protected void Run2()
        {
            while (true)
            {
                if (StagingQueue.IsDNDavailable)
                {
                    DomainData dnd = StagingQueue.GetDND();

                    MaxOutboundLinks = 3;
                    AvoidHttps = true;
                    InsideLinks = false;
                    VerifyBackLinks = true;

                    MQmanager.AddDN2Q(ParsePage(dnd));

                    foreach (string link in dnd.Hlinks)
                    {
                        DomainData dndLink = new DomainData(dnd.MainSeqno,link.ToString());
                        dndLink.ParentDomainName = dnd.DomainName;
                        dnd.PageSource = String.Empty;
                        MQmanager.AddDN2Q(dndLink);
                    }                    
                }
                Thread.Sleep(new Random().Next(20));
            }
        }


        protected void Run3()
        {
            while (true)
            {
                if (MQmanager.IsDNDavailable)
                {
                    DomainData dnd = MQmanager.GetDND();
                    RunAlexa(dnd);
                    RunCompete(dnd);
                    RunQuantcast(dnd);

                    CQmanager.AddDN2Q(dnd, MQmanager, 1000);
                }
                Thread.Sleep(new Random().Next(20));
            }
        }


        private string CapturePage(string URIstring)
        {
            Uri myUri;
            try
            {
                myUri = new Uri(URIstring);
            }
            catch (Exception URIex)
            {
                return String.Empty;
            }

            string proxyIP = ProxyManager.GetCurrentProxy() == "" ? ProxyManager.GetProxy() : ProxyManager.GetCurrentProxy();
            int proxCtr = 0;

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(myUri);
            WebProxy Proxy = new WebProxy(proxyIP);
            request.Proxy = Proxy;
            request.Timeout = 20000;

            try
            {
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
                    using (StreamReader strmRdr = new StreamReader(response.GetResponseStream(), Encoding.ASCII))
                    {
                        return strmRdr.ReadToEnd();
                    }
                }
            }
            catch (InvalidOperationException Wex)
            {
                . . .
            }
        }
12.10.2009 21:25:16
1 ОТВЕТ

Вы используете StreamReader с кодировкой ASCII. Если данные, отправляемые сервером, не имеют правильной кодировки ASCII, то StreamReader не будет правильно записывать данные в строку.

Обратите внимание, что сервер может явно поместить кодировку страницы либо в заголовки ответа, либо использовать тег META в самом содержимом страницы.

На следующей странице показано, как загрузить данные, используя правильные кодировки: http://blogs.msdn.com/feroze_daud/archive/2004/03/30/104440.aspx

Также возможно, что вы не получаете полное тело сущности с сервера, это может быть связано с плохим прокси или чем-то другим.

Возможно, вы захотите добавить больше диагностики в ваше приложение. Зарегистрируйте загруженные байты # и использованный прокси. Затем вы можете сделать Encoding.ASCII.GetBytes (string) .Length и убедиться, что он совпадает с загруженным #bytes. если это не так, то у вас проблема с кодировкой страниц. Если это не так, значит у вас плохой прокси на пути.

Надеюсь это поможет.

2
12.10.2009 23:25:59
Большое спасибо, feroze. Я применил ваши предложения, и моя проблема решена. Сейчас я работаю над асинхронными веб-вызовами. Любые предложения от вас или других будут великолепны. Кстати, я люблю этот сайт. Я многому учусь, просто читая вопросы и ответы и комментарии. Приветствую всех, кто вносит свой вклад!
JLP188 15.10.2009 21:38:54