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