Поддержание работы моего веб-приложения после закрытия браузера - PullRequest
1 голос
/ 14 марта 2009

У меня есть веб-приложение aspx, которое обновляет или добавляет файлы в базу данных. Клиенты получают доступ через браузер, и одно из требований заключается в том, что они могут запустить обновление и иметь возможность закрыть браузер, пока обновление продолжается. Кажется, он запускается некоторое время после закрытия браузера, но затем останавливается. Как вы можете сохранить приложение работает на asp.net?

Ответы [ 5 ]

3 голосов
/ 14 марта 2009

Это то, что вы можете очень хорошо решить с помощью WF (Workflow Foundation) . Создайте рабочий процесс для задачи, которая должна выдержать закрытие браузера. Рабочие процессы имеют свои собственные потоки и жизненные циклы отдельно от ASP.NET.

1 голос
/ 14 марта 2009

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

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

1 голос
/ 14 марта 2009

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

Хотя лучшим подходом было бы перенести долгосрочную задачу в службу, но это может потребовать переписывания вашего приложения.

0 голосов
/ 14 марта 2009

Я столкнулся с этим шаблоном, и вы должны отделить работу от HTTP-запроса. Способ, которым мы решили это, состоит в том, чтобы абстрагироваться от вычислений, которые должны быть выполнены, как запланированное событие. Итак, скажем, пользователь в браузере выполняет действие, которое требует длительных (относительно) вычислений на серверной части, этим вычислениям присваивается имя типа 'doXYZForUser' и задается вектор параметров, например (userId, params ...) отправили в очередь на работу. Через некоторое время пользователь снова войдет в систему и увидит статус своей работы.

Я использую стек Java и службу сообщений Java (JMS), но принцип тот же. Запрос от браузера ставит в очередь событие, и браузер возвращает ACK, сообщая, что событие находится в рабочей очереди. Очередь управляется совершенно отдельно запущенным процессом, который в .NET, я считаю, называется просто Очередь сообщений. Задание поступает в очередь обработки, и результаты могут быть помещены в отдельную таблицу, содержащую ссылку на пользователя, с которого началось задание, поэтому при следующем входе в систему статус / результаты задания могут быть возвращены.

0 голосов
/ 14 марта 2009

Я бы создал отдельную службу Windows, в которую вы можете помещать задания из своего веб-приложения, а затем проверять состояние заданий, когда пользователь снова входит в систему.

Служба Windows не будет привязана к домену приложения asp.net, поэтому она будет продолжать работать независимо от того, что происходит в вашем веб-приложении.

...