WebRequest и ресурсы - ASP.NET Timeout - PullRequest
1 голос
/ 26 июля 2010

У меня есть приложение ASP.NET Web Forms, которое внутренне выполняет много вызовов SOAP и REST к веб-службам.Вызовы SOAP выполняются с использованием собственного «упаковочного» кода Microsoft.Вызовы REST сделаны из простого клиента REST.Этот клиент использует блоки «Использование» для удаления любых ресурсов.

Приложение работает нормально в течение нескольких часов, но затем зависает.Сайт больше не сможет обслуживать страницы asp.net.Я проверил сайт, поместив на него файл hello.htm ... он работал нормально.Так что это определенно проблема в пространстве движка ASP.NET.

Такое ощущение, что у него закончились веб-запросы из пула.Я мог бы быть далеко.Что я могу попробовать?На что мне смотреть?Чтобы воспроизвести проблему, нужны часы.Перезапуск сайта в IIS устраняет проблему, но, конечно, это не то исправление, с которым мы можем жить.

начало ошибки и трассировка стека:
Ошибка сервера в '/'Приложение.

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

Сведения об исключении: System.Net.WebException: истекло время ожидания операции

Ошибка источника: во время выполнения текущего веб-запроса было сгенерировано необработанное исключение.Информация о происхождении и местонахождении исключения может быть идентифицирована с помощью приведенной ниже трассировки стека исключений.

Трассировка стека: [WebException: истекло время ожидания операции] System.Net.HttpWebRequest.GetRequestStream () +5322142 System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke (String methodName, Object [] параметры) +103

ОБНОВЛЕНИЕ и ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
Все доморощенные вызовы REST и SOAP выполняются синхронно.
Они недолговечны и занимают около 1 с.
WebСлужбы размещаются на сервере Tomcat (на другой машине) в одном и том же центре обработки данных.
Приложение .NET вызывает службы SOAP и REST на сервере Tomcat.

Приложение каким-то образом исправилось примерно через часоставаясь в таком зависшем состоянии.Мысли?Как я могу контролировать .NET Threadpool?Влияет ли DefaultConnectionLimit на инициируемые самостоятельно исходящие соединения?

РАЗРЕШЕНИЕ см. Дополнительные комментарии к ответам и ... 1) закрыть все потоки и ответы / запросы из собственного доменного кода REST (упс)
2) System.Net.ServicePointManager.DefaultConnectionLimit = 96;
// по умолчанию = 12 раз # ядер
System.Net.ServicePointManager.MaxServicePointIdleTime = 3000;
// default = 100000 (100 секунд)
Путем исправления любого кода утечки иТайм-аут IdleTime быстрее, кажется, теперь все работает нормально

1 Ответ

3 голосов
/ 27 июля 2010

1) Используете ли вы асинхронные веб-запросы? 2) Длительны ли ваши звонки через веб-сервис (значит, они требуют много времени?) 3) Где размещен веб-сервис? Это на одной машине? 4) Где находится служба REST? Та же машина, что и в приложении asp.net, или другая?

Когда запрос поступает на сервер ASP.NEt, он обрабатывается в потоке пула потоков. Я не уверен, будет ли это поток завершения порта или поток пула потоков.

В любом случае, ваше приложение вызывается из потока пула потоков. В этом потоке вы делаете исходящий HTTPWebRequest (HWR). Если этот запрос является синхронным, он не должен занимать какой-либо дополнительный поток. Однако, если он асинхронный, для завершения потребуется другой поток из пула.

Теперь, если созданная вами HWR вернулась на тот же сервер, и для выполнения этого запроса требуется другой поток на том же сервере, теперь у вас есть потребность в еще одном потоке. Объедините это с Web-сервисом, занимающим много времени, и вы связываете как минимум 2 (максимум 3) потока на запрос. Если вы отправляете много запросов на сервер asp.net, сервер может быстро достичь максимального ограничения потока потоков.

Пока что я предполагаю, что в вашем коде нет логических ошибок, и вы корректно избавляетесь от объектов HttpWebResponse.

Таким образом, если нет потока для завершения работы, ваш HttpWebRequest может выдать исключение тайм-аута.

Это также может произойти, если ваши внутренние вызовы веб-службы выполняются на том же компьютере, и вы не увеличили значение ServicePointManager.DefaultConnectionLimit до приемлемого значения для вашего сценария. Например, если ваше приложение asp.net ожидает выполнения 200 одновременных запросов, вы должны установить DefaultConnectionLimit = 200 + некоторый разумный буфер. Отсутствие соединения в пуле соединений также может быть причиной этого.

Решение:

Сначала я бы добавил DefaultConnectionLimit. Если это не решает проблему, вам нужно будет отслеживать счетчики производительности ASP.NET и посмотреть, не исчерпан ли пул потоков .Net, что может привести к сбою веб-запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...