Жизненный цикл ASP.NET и длительный процесс

Я знаю, что нам нужно лучшее решение, но нам нужно сделать это прямо сейчас. У нас есть длительный процесс импорта, который запускается, когда вы нажимаете кнопку запуска импорта на веб-странице aspx. Это занимает много времени ... иногда несколько часов. Я изменил тайм-аут, и это нормально, но примерно через час я продолжаю получать ошибку сброса сервера соединений. Я думаю, что это жизненный цикл asp.net, и я хотел бы знать, есть ли в IIS настройки, которые я могу изменить, чтобы продлить этот жизненный цикл.


person user204588    schedule 09.01.2010    source источник
comment
stackoverflow.com/questions/118261 /   -  person Mauricio Scheffer    schedule 04.05.2010


Ответы (5)


Вы почти наверняка должны выполнять длительную работу в отдельном процессе (а не только в отдельном потоке).

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

Таким образом, ваша страница просто приступит к работе. Впоследствии он может обновляться каждые несколько минут, пока не будет установлен флаг «завершено». Вы можете отобразить таблицу журнала, если хотите быть уверенным, что она все еще работает и не умерла.

Это довольно простой материал, но если вам нужны примеры кода, они могут быть предоставлены.

person egrunin    schedule 13.04.2010
comment
Я бы пошел дальше и сделал бы это службой NT. База данных, которую вы предлагаете для связи с веб-сервером, в порядке, или используйте WCF. - person Ian Mercer; 13.04.2010
comment
Если это процесс, который запускается нечасто и завершается по завершении, я не уверен, в чем будет преимущество службы. - person egrunin; 13.04.2010

Еще один момент, который следует учитывать, который может объяснить поведение, заключается в том, что aspnet_wp.exe перерабатывает, если используется слишком много памяти (не путайте это с жизненным циклом страницы)

Если ваш долгий процесс занимает слишком много памяти, ASP.NET запустит новый процесс и переназначит все существующие запросы. Я бы посоветовал проверить это. Вы можете сделать это, посмотрев в диспетчере задач на aspnet_wp и проверив размер используемой памяти - если размер внезапно уменьшится, он будет переработан.

Вы можете изменить ограничение памяти в machine.config:

  <system.web>
    <processModel autoConfig="true"/>

Используйте memoryLimit, чтобы указать максимально допустимый размер памяти в процентах от общей системной памяти, которую рабочий процесс может использовать до того, как ASP.NET запустит новый процесс и переназначит существующие запросы. (По умолчанию 60)

<system.web>
    <processModel autoConfig="true" memoryLimit="10"/>

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

person Mister Cook    schedule 10.01.2010

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

Вы также можете попробовать запустить это как вызов ajax вместо обратной передачи, которая имеет другие ограничения ...

Поскольку вы понимаете, что это не способ сделать это, я не буду перечислять альтернативы. Я уверен, что вы знаете, что это такое :)

person Ariel    schedule 09.01.2010

Продление тайм-аута определенно не способ сделать это. Время отклика должно быть минимальным. Если это вообще возможно, я бы попытался полностью вывести эту длительную задачу из приложения ASP.NET и запустить ее как отдельный процесс.

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

person Quick Joe Smith    schedule 09.01.2010

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

Или, если важно иметь пользовательский интерфейс в клиентском браузере (если они будут торчать n часов), тогда у вас может быть WebMethod, который вызывается из клиента (JavaScript) с помощью SetInterval, чтобы периодически проверять, выполнено ли это.

person Mister Cook    schedule 10.01.2010
comment
Отдельный поток также влияет на жизненный цикл, потому что я поместил его в отдельный поток, и он все еще останавливается примерно через 45 минут после начала процесса. - person user204588; 10.01.2010
comment
Жизненный цикл страницы не должен влиять на фоновый поток, но на него может повлиять переработка asp.net (см. Мой новый пост) - person Mister Cook; 10.01.2010
comment
После завершения вашего начального запроса страницы ваш отдельный поток отключается от любого запроса. Когда пул приложений перезапускается или очищается, он видит зависший поток и завершает его. - person ulty4life; 09.08.2011