Мне нужна помощь в настройке таймаута .NET HttpWebRequest - PullRequest
3 голосов
/ 22 декабря 2008

Моя цель - получить ответ от 6000 URL-адресов в кратчайшие сроки. Он работал очень хорошо (12 секунд для 5200 адресов локальной сети), пока не начала происходить некоторая задержка.

Мой код использует до 20 одновременных HttpWebRequest.BeginGetResponse с ThreadPool.RegisterWaitForSingleObject для обработки тайм-аута.

Однако некоторые (до 4 на 5000) запросов никогда не обращаются к функции TimeoutCallback со вторым параметром (timedOut) true, и они тратят 5 минут моего драгоценного времени, пока не достигают функции BeginGetResponseCallback и затем вызывают исключение WebException. В исключениях написано что-то вроде «операция достигла предела времени», но поскольку сообщение об исключении написано на португальском (мой родной язык), я не смог найти его в Google.

Интересно, могу ли я, например, сократить этот срок до 20 секунд? Кто-нибудь знает как? Я уже пробовал:

<system.web>
    <httpRuntime executionTimeout="20"/>
</system.web>

Но поскольку я запускаю его как консольное приложение, конфигурации ASP.NET не работают. И я тоже попробовал:

myHttpWebRequest.Timeout = 20*1000;

И

ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, new WaitOrTimerCallback(TimeoutCallback), AsyncState, 20*1000, true);

Без успеха. Вы можете мне помочь?

Обновление Я пытаюсь сказать, что есть 4 возможных результата для асинхронного HTTP-запроса:

  1. Никогда не достигать функции обратного вызова -> функция обратного вызова тайм-аута
  2. Достигает и успешно отвечает
  3. Достигает и вызывает исключение
  4. Задержка ровно на 5 минут, пока не появится веб-исключение "ограничение по времени" внутри функции обратного вызова

Четвертая возможность - это задержка моего заявления, и я не знаю, как сократить эту задержку

Обновление Есть ли вероятность, что метод GetResponseStream вместо GetResponse вызывает таймаут?

Ответы [ 2 ]

4 голосов
/ 23 декабря 2008

Похоже, вам нужно установить свойство ReadWriteTimeout объекта запроса.

http://blogs.msdn.com/buckh/archive/2005/02/01/365127.aspx

1 голос
/ 26 ноября 2013

.Timeout = время, потраченное на попытку установить соединение (не включая время поиска) .ReadWriteTimeout = время, потраченное на попытку чтения или записи данных после установления соединения

...