Операция испытала таймаут с WebClient. DownloadFile и корректный URL

Давайте процитируем руководство :

пример, данный здесь, изобретен, конечно, но для вывода большие блоки из текста, выпадая из PHP парсинг режима обычно более эффективен, чем отправка всего текста через эхо () или печать ().

, Но слушайте другие и избегайте этого вида микро оптимизации и выберите ту, которая является более четкой.

я могу предложить третье решение? Вы услышали о движках шаблонов? Они помогают Вам создать четкое разделение между кодом и презентацией, которая обычно приводит к более чистому коду, который легче поддержать. Популярное, которое такой движок шаблонов, например, присяжный острослов , но существует сотни с различными преимуществами.

7
задан Sergey Brunov 15 August 2013 в 11:54
поделиться

2 ответа

Если бы я был на вашем месте, вот несколько возможностей, которые я бы исследовал:

  • если вы запускаете этот код из нескольких потоков, вы можете столкнуться с System.Net .ServicePointManager.DefaultConnectionLimit свойство. Попробуйте увеличить его до 50–100 при запуске приложения. обратите внимание, что я не думаю, что это ваша проблема, но попробовать это проще, чем что-либо другое ниже. : -)
  • Другая возможность - вы забиваете сервер. Обычно это сложно сделать с однопоточным клиентом, но возможно, поскольку несколько других клиентов также могут подключаться к серверу. Но поскольку проблема всегда возникает на № 25, это кажется маловероятным, поскольку вы ожидаете увидеть больше вариаций.
  • Возможно, у вас возникла проблема с резервным копированием HTTP-соединений keepalive между вашим клиентом и сервером. это тоже кажется маловероятным.
  • жесткое ограничение 25 заставляет меня думать, что это может быть ограничение прокси или брандмауэра, либо на вашей стороне, либо на сервере, где> 25 соединений, сделанных с одного клиентского IP-адреса на один сервер (или прокси), будут ограничены.

Мои деньги на последний, так как тот факт, что он всегда прерывается при хорошем круглом количестве запросов, и что включение отладчика (он же медленнее!) Не вызывает проблемы.

Проверить все это , Я бы начал с простого: придерживайтесь задержки (Thread.Sleep) перед каждым HTTP-вызовом и посмотрите, исчезнет ли проблема. Если это так, уменьшите задержку, пока проблема не вернется. Если этого не происходит, увеличьте задержку до большого числа (например, 10 секунд), пока проблема не исчезнет. Если это не пройдет с задержкой в ​​10 секунд, это действительно загадка, и я ' Мне нужна дополнительная информация для диагностики.

Если он уходит с задержкой, то вам нужно выяснить, почему - и является ли ограничение постоянным (например, брандмауэр сервера, который вы не можете изменить) или что-то, что вы можете изменить. Чтобы получить дополнительную информацию, вам нужно будет синхронизировать запросы (например, проверять DateTime.Now до и после каждого вызова), чтобы увидеть, видите ли вы шаблон. Если все тайминги совпадают и внезапно становятся огромными, это предполагает регулирование сети / брандмауэра / прокси. Если время постепенно увеличивается, это говорит о том, что сервер постепенно перегружается и очередь запросов увеличивается.

В дополнение к таймингу запросов, я бы установил более длительный тайм-аут вызовов вашего веб-клиента, чтобы вы могли определить, бесконечен ли тайм-аут или он немного больше, чем по умолчанию. Для этого вам понадобится альтернатива классу WebClient, поскольку он не поддерживает тайм-аут. В этой ветке на форумах MSDN есть разумный альтернативный пример кода.

Альтернативой добавлению времени в код является использование Fiddler:

  • загрузите fiddler и запустите его.
  • настройте свойство Proxy кода веб-клиента так, чтобы оно указывало на прокси-сервер fiddler (localhost: 8888).
  • запустите приложение и посмотрите на fiddler.
18
ответ дан 6 December 2019 в 06:50
поделиться

кажется, что WebClient не закрывает объект Response , который он использует по завершении, что приведет к тому, что в вашем случае многие ответы будут открыты по адресу в то же время и с ограничением 25 подключений на удаленном сервере вы получили «исключение тайм-аута». При отладке ранние открытые ответы закрываются из-за их внутреннего тайм-аута и т. Д. (Я обнаружил WebClient , что с помощью Reflector я не могу найти инструкцию для закрытия ответа).

Я предлагаю, чтобы вы использовали HttpWebRequest & HttpWebResponse , чтобы вы могли очищать объекты после каждой загрузки:

HttpWebRequest request;
HttpWebResponse response = null;

try
{

   FileStream fs;
   Stream s;
   byte[] read;
   int count;

   read = new byte[256];

   request = (HttpWebRequest)WebRequest.Create(remoteFilename);
   request.Timeout = 30000;
   request.AllowWriteStreamBuffering = false;

   response = (HttpWebResponse)request.GetResponse();
   s = response.GetResponseStream();  

   fs = new FileStream(localFilename, FileMode.Create);   
   while((count = s.Read(read, 0, read.Length))> 0)
   {
      fs.Write(read, 0, count);
      count = s.Read(read, 0, read.Length);
   }

   fs.Close();
   s.Close();
}
catch (System.Net.WebException)
{
    //....
}finally
{
   //Close Response
   if (response != null)
      response.Close();
}
4
ответ дан 6 December 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: