Обычно я хотел бы написать службу Windows для управления задачами, которые не подходят для размещения в веб-приложении. Эти типы задач обычно представляют собой длительные процессы или запланированные задачи. Хотя это обычно является основным подходом к этим задачам, люди рассматривали способы запуска таких фоновых процессов в веб-приложении путем ногами отключить несколько потоков в событии Application_Start, выставленном Global.asax. Проблема с этим подходом всегда заключалась в том, что, если ваш рабочий процесс IIS умирает, ваш фоновый поток также убивается (эффективно ваша "служба Windows" останавливается до получения следующего запроса).
ASP.NET 4.0 предлагает решение этой проблемы. Теперь вы можете установить StartMode на "AlwaysRunning", как описано в этом сообщении в блоге Скотта Гу. Где-то в комментариях к этому сообщению кто-то задает вопрос о целесообразности размещения задач типа Windows Service в IIS, поскольку новая функция обеспечивает рабочий процесс всегда работает. Скотт упомянул, что это определенно поддержит сценарий. В дополнение к этому недавнее введение AppFabric означает, что сами Microsoft предоставляют простые перехваты для хостинга и мониторинга WCF и WF-сервисов в веб-приложении.
Что это значит для тех из нас, кто использовал для написания Windows Services для поддержки наших веб-приложений? Должна ли мы принять эту модель? Каковы подводные камни? Насколько я могу судить, существует ряд преимуществ для хостинга процессов "Windows Service" в веб-приложении, причем наиболее полезным является простота развертывания. Кроме того, мы можем начать разработку простых пользовательских интерфейсов для наших сервисов, которые предоставляют информацию о том, что происходит во время выполнения.
Если бы мне пришлось идти по этому маршруту, я не думаю, что я бы использовал функции типа "Служба Windows" в клиентском веб-приложении. Я бы, вероятно, разработал новый проект веб-приложений (как и в контексте Windows Service), который будет содержать мои длительные/запланированные задачи. Думаю, для этого мало причин.
- Безопасность. Может существовать другая модель безопасности для пользовательского интерфейса, отображающего информацию о текущих фоновых процессах. Я бы не хотел раскрывать этот интерфейс никому другому, кроме команды ops. Кроме того, веб-приложение может работать как другой пользователь, который имеет повышенный набор разрешений.
- Обслуживание. Было бы замечательно иметь возможность развертывать изменения в приложении, на котором выполняются фоновые процессы, не влияя на пользователя с помощью веб-сайта переднего конца.
- Производительность. Наличие приложения, отделенного от обработки запросов основного сайта, означает, что фоновые потоки не будут уменьшать возможности IIS для обработки очереди входящих запросов. Кроме того, приложение, обрабатывающее фоновые задачи, может быть развернуто на отдельный сервер, если это необходимо.
Мне было бы очень интересно услышать ваши мысли об этом подходе и должен ли я придерживаться Windows Services. Я очень склонен попробовать этот новый подход.