Каждый запрос в приложении ASP .NET, развернутый в IIS, рассматривается как поток или упрощенный процесс? - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть приложение .NET MVC , развернутое в IIS.Получив запрос, я должен начать работу (это может занять несколько часов).Итак, я создавал поток внутри уровня контроллера и позволял потоку выполнять работу асинхронно, а поток запроса возвращал идентификатор клиенту.При отладке я обнаружил, что поток, который я создал внутри уровня контроллера, также заканчивался, как только закончился поток запроса (то есть цикл запроса http закончился, и ответ возвращается клиенту).Я попытался создать поток, используя обычную библиотеку потоков, а также системный пул потоков.Все темы были на переднем плане.Тем не менее я не могу понять, почему вновь созданный поток должен заканчиваться, как только завершается поток запроса.Я догадываюсь, что для каждого нового запроса IIS может создавать облегченный процесс .Поскольку этот поток был создан из процесса, он также должен завершиться при выходе из процесса (в этом случае процесс должен завершиться после завершения http-запроса), что является единственным правдоподобным объяснением.Я прав здесь?любые выводы будут оценены.

1 Ответ

0 голосов
/ 21 декабря 2018

Запрос имеет явное время ожидания, которое определяется сервером.Я забыл, какое значение по умолчанию, но это явное время ожидания определенно будет меньше, чем часы.См. Этот пост для получения дополнительной информации: Как увеличить executeTimeout для долго выполняющегося запроса?

<system.web>
   <httpRuntime  executionTimeout = "SOME LARGE VALUE" />

Это увеличит время ожидания для ВСЕХ страниц в приложении, поэтому используйте элемент locationИдеально определить его для одного пути:

<location path="Pathtolongrunningtask">
    <system.web>
       <httpRuntime  executionTimeout = "SOME LARGE VALUE" />

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

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

Как правило, могут возникнуть проблемы с выполнением этого в течение жизненного цикла HTTP - если вы можете использовать задачу Windows, веб-работника Azure или что-то вне жизненного цикла HTTP, это будет работать лучше.

...