Я обычно выполняю асинхронную обработку на стороне сервера следующим образом:
Сделайте так, чтобы веб-страница инициировала запрос к веб-службе, и чтобы служба возвращала идентификатор долгосрочномусделка.В моем случае я использовал Ajax с jQuery на веб-странице клиента и веб-сервис, который возвращает данные в формате JSON.ASP.NET MVC особенно хорошо подходит для этого, но вы можете использовать ASP.NET для возврата строки JSON в ответ на GET или вообще не использовать JSON.
Есть серверсоздать запись в базе данных, которая также хранит связанные данные для обработки.Идентификатор этой транзакции возвращается на веб-страницу клиента.Затем служба отправляет сообщение третьему сервису через очередь сообщений.В моем случае это была служба WCF, размещенная в службе Windows с MSMQ в качестве посредника.Следует отметить, что лучше не выполнять фактическую обработку задач в ASP.NET, поскольку она не предназначена для длительных запросов.В системе с высоким спросом вы можете исчерпать доступные потоки.
Третий сервис получает и отвечает на сообщение в очереди, считывая и обрабатывая необходимые данные из базы данных.В конечном итоге он отмечает запись базы данных как «завершенную».
Клиентская веб-страница опрашивает веб-сервис, передающий идентификатор записи транзакции.Веб-служба запрашивает базу данных на основе этого идентификатора, чтобы определить, помечена ли запись как завершенная или нет.Если он завершен, он запрашивает результирующий набор данных и возвращает его.В противном случае он возвращает пустой набор.
Клиентская веб-страница обрабатывает ответ веб-службы, который будет содержать результирующие данные или пустой набор, в котором он должен продолжить опрос.
Это просто пример, вы можете обнаружить, что вы можете использовать ярлыки и избегать обработки в третьем сервисе и просто использовать потоки ASP.NET.Но это создает свои собственные проблемы, а именно то, как у вас будет другой запрос (запрос на опрос), чтобы узнать, завершен ли исходный запрос.Решение этой проблемы - использовать потокобезопасную коллекцию в статической переменной, которая будет содержать пару идентификатор транзакции / результат.Но для этих усилий действительно лучше использовать базу данных.
РЕДАКТИРОВАТЬ: теперь я вижу, что это, скорее, демонстрационная, чем производственная система.Я все еще придерживаюсь своей схемы, приведенной выше, для ситуаций «реального мира», но для демонстрации «хакерского» решения будет достаточно.