Самый быстрый способ очистить все веб-страницы на одном веб-сайте - PullRequest
5 голосов
/ 13 июня 2011

У меня есть приложение на C #, которому нужно как можно быстрее очистить множество страниц в определенном домене. У меня есть Parallel.Foreach, который перебирает все URL (многопоточные) и очищает их, используя код ниже:

private string ScrapeWebpage(string url, DateTime? updateDate)
        {
            HttpWebRequest request = null;
            HttpWebResponse response = null;
            Stream responseStream = null;
            StreamReader reader = null;
            string html = null;

            try
            {
                //create request (which supports http compression)
                request = (HttpWebRequest)WebRequest.Create(url);
                request.Pipelined = true;
                request.KeepAlive = true;
                request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
                if (updateDate != null)
                    request.IfModifiedSince = updateDate.Value;

                //get response.
                response = (HttpWebResponse)request.GetResponse();
                responseStream = response.GetResponseStream();
                if (response.ContentEncoding.ToLower().Contains("gzip"))
                    responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
                else if (response.ContentEncoding.ToLower().Contains("deflate"))
                    responseStream = new DeflateStream(responseStream, CompressionMode.Decompress);

                //read html.
                reader = new StreamReader(responseStream, Encoding.Default);
                html = reader.ReadToEnd();
            }
            catch
            {
                throw;
            }
            finally
            {//dispose of objects.
                request = null;
                if (response != null)
                {
                    response.Close();
                    response = null;
                }
                if (responseStream != null)
                {
                    responseStream.Close();
                    responseStream.Dispose();
                }
                if (reader != null)
                {
                    reader.Close();
                    reader.Dispose();
                }
            }
            return html;
        }

Как видите, у меня есть поддержка сжатия http, и я установил для request.keepalive и request.pipelined значение true. Мне интересно, является ли код, который я использую, самым быстрым способом очистки множества веб-страниц на одном сайте или есть лучший способ сохранить сеанс открытым для нескольких запросов. Мой код создает новый экземпляр запроса для каждой страницы, на которую я нажал. Должен ли я пытаться использовать только один экземпляр запроса, чтобы просмотреть все страницы? Идеально ли иметь конвейеризацию и поддержку активности?

1 Ответ

1 голос
/ 13 июня 2011

Оказывается, мне не хватало этого:

ServicePointManager.DefaultConnectionLimit = 1000000;
...