Несколько недель назад я задал аналогичный вопрос на SO. Короче говоря, мой подход в течение некоторого времени заключался в разработке службы Windows. Я бы использовал NServiceBus (по сути, MSMQ под прикрытием) для маршалинга запросов от моего веб-приложения к моему сервису. Раньше я использовал WCF, но заставить распределенную транзакцию правильно работать через WCF всегда казалось головной болью. NServiceBus сделал свое дело, я мог фиксировать данные и создавать задачи в транзакции и не беспокоиться о том, работает ли мой сервис в то время. В качестве простого примера, если мне когда-нибудь понадобится отправить электронное письмо (например, регистрационное электронное письмо), я создам учетную запись пользователя и отправлю сигнал моей службе Windows (для отправки электронного письма) в транзакции. Обработчик сообщений на стороне службы подберет сообщение и обработает его соответствующим образом.
С тех пор как были выпущены ASP .NET 4.0 и AppFabric, существует ряд жизнеспособных альтернатив вышеописанному механизму. Возвращаясь к вопросу, который я упомянул выше, у нас теперь есть AppInitialize AppFabric (через net.pipe), а также функция автоматического запуска ASP .NET 4.0, которые делают разработку служб Windows как веб-приложений жизнеспособной альтернативой. Я начал делать это сейчас по ряду причин (главной из которых является развертывание, которое больше не является занозой в заднице):
Если вы пойдете по этому пути (простите меня за копирование и вставку из моего исходного сообщения), я определенно рассмотрю возможность запуска фоновой логики в отдельном веб-приложении. На это есть ряд причин:
Это возвращает нас к аспекту маршалинга. WCF, NServiceBus/RabbitMQ/ActiveMQ и т. д., vanilla MSMQ, RESTful API (думаю, MVC) — все это варианты. Если вы используете Windows Workflow 4.0, вы можете предоставить конечную точку хоста, которую может использовать ваше веб-приложение.
Подход к услугам веб-хостинга все еще довольно нов для меня, только время покажет, был ли это правильный выбор. Хотя пока все хорошо. Кстати, если вы не хотите использовать AppFabric (я не мог, потому что по какой-то странной причине Windows Server Web Edition не поддерживается), функция автозапуска, упомянутая в посте Гу, прекрасно работает. Однако держитесь подальше от файла applicationhost.config, все в этом посте можно настроить через консоль IIS (редактор конфигурации на уровне основного сервера).
Примечание: изначально я разместил еще несколько ссылок в этом сообщении, но, увы, это мой первый пост на эту биржу, и поддерживается только одна ссылка! По сути, было еще два других, чтобы заставить их Google «Смерть службам Windows ... Да здравствует AppFabric!» и «автозапуск приложений asp-net». Извини за это.
Рекомендую посмотреть эти видео для лучшего погружения в вопрос: