Перейти к содержимому

Фото
- - - - -

WebClient (C#)


  • Вы не можете создать новую тему
  • Please log in to reply
6 ответов в этой теме

#1 SmokEr

SmokEr
  • Пользователь
  • 119 сообщений

Отправлено 09 Январь 2010 - 15:23

Написал я программку, которая тянет ХТМЛ из сети.
Делаю это самым наипростейшим способом:
try
{
    WebClient client = new WebClient();
    result = client.DownloadString(url);
}
Выполняется этот код в цикле и может вызываться до 250 раз, и беда в том, что делается это жутко долго. Как я понимаю, в каждой итерации, для того, что бы стянуть очередную порцию ХТМЛ кода, моя софтина заново соединяется с сервером. Есть ли вариант с установкой постоянного соединения, что бы делать это 1 раз, а потом тянуть все мои данные??
  • 0

#2 Ken0-

Ken0-
  • Пользователь
  • 53 сообщений

Отправлено 09 Январь 2010 - 18:57

Помоему легче скачать HTML код странички с помощью httpwebrequest и httpwebresponse!
  • 0
Если в слове ХЛЕБ сделать 4 ошибки получиться ПИВО, а если сделать 5 ошибок ... получиться ВОДКА.!!!

#3 Warvick

Warvick
  • Пользователь
  • 411 сообщений
  • Откуда:Tallinn

Отправлено 09 Январь 2010 - 19:11

какойто пулинг предоставляется фреймворком. правда, насколько я помню, по умолчанию у тебя будет всего 2 соединения с одним сервером.
так что задержка у тебя от того, что запросы, становятся в очередь на обработку.
поведение можно изменить при помощи конфигурационного файла.
не стоит забывать также о мультипоточности и асинхронности. ещё можно расиширить пул и запускать в цикле новые потоки паралельно.
или пользоваться WebClient.OpenReadAsync и ловить собитие OpenReadCompleted
немного инфы тут:
http://msdn.microsof...ent(VS.95).aspx
http://blogs.msdn.co...ges/345411.aspx
http://blogs.msdn.co.../11/463865.aspx
http://msdn2.microso...connection.aspx
  • 0
Да, я такой!

#4 Ken0-

Ken0-
  • Пользователь
  • 53 сообщений

Отправлено 09 Январь 2010 - 19:23

string url = "http://google.com";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader str_out = new StreamReader(response.GetResponseStream());
Console.WriteLine(str_out.ReadToEnd());
Ну вот примерно такой код тащит html! Если я правильно понял.. Если нет то сорри :rolleyes:
  • 0
Если в слове ХЛЕБ сделать 4 ошибки получиться ПИВО, а если сделать 5 ошибок ... получиться ВОДКА.!!!

#5 Warvick

Warvick
  • Пользователь
  • 411 сообщений
  • Откуда:Tallinn

Отправлено 09 Январь 2010 - 20:35

string url = "http://google.com";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader str_out = new StreamReader(response.GetResponseStream());
Console.WriteLine(str_out.ReadToEnd());
Ну вот примерно такой код тащит html! Если я правильно понял.. Если нет то сорри :rolleyes:

да WebClient внутри себя тоже самое и использует. вопрос как я понял был в оптимизации скорости работы.
  • 0
Да, я такой!

#6 Mastahh

Mastahh
  • Пользователь
  • 448 сообщений
  • Откуда:Tallinn

Отправлено 11 Январь 2010 - 01:20

WebClient.Proxy = null;
Попробуй так должно заметно быстрее, и зачем каждый раз создавать WebClient client = new WebClient();
Можно один раз создать.
А если ещё быстрее надо, то тогда надо через Socket.
Хотя ВебКлиент не так уж и медленно работает.
  • 0

#7 Warvick

Warvick
  • Пользователь
  • 411 сообщений
  • Откуда:Tallinn

Отправлено 12 Январь 2010 - 00:31

создавать каждый раз класс конечно не гуд,
но я всё таки уверен что пул все равно не позволит больше Н-ного кол-ва раз одновременно бомбить сервак запросами, есть там прокся или нету - без разницы.
  • 0
Да, я такой!