Автозапуск приложений ASP.NET (из серии статей про VS 2010 и .NET 4.0)

Это седьмая из серии статей, в которых я пишу о готовящихся к выходу VS 2010 и .NET 4.

Я хотел бы отойти от обсуждения новых инструментальных возможностей VS 2010 и написать несколько заметок про новые возможности среды времени выполнения (не волнуйтесь - я вернусь к обсуждению многочисленных новых возможностей VS, я лишь хочу немного разбавить тему).

Сегодня я расскажу об одной небольшой, но очень приятной новой возможности, которой вы можете воспользоваться в ASP.NET 4, - это возможность автоматически запускать и заблаговременно инициализировать веб-приложение, не дожидаясь первого запроса клиента к веб-серверу. Это обеспечит более быструю реакцию на первые запросы к вашему веб-приложению и позволит избежать написания собственных скриптов для "разогрева" сервера и заполнения любых используемых кэшей данных. Автозапуск работает с любыми видами веб-приложений ASP.NET, включая приложения на базе ASP.NET MVC.

Автозапуск приложений с ASP.NET 4

Некоторым веб-приложениям перед тем, как они смогут начать обрабатывать клиентские запросы, необходимо загрузить большие объемы данных или же выполнить инициализационные процедуры, требующие больших вычислительных ресурсов. Сейчас разработчики ASP.NET зачастую решают эти задачи, используя обработчик события "Application_Start" в файле приложения Global.asax (которое срабатывает при обработке первого запроса). Затем они либо разрабатывают хитроумные скрипты, которые посылают веб-приложению подложные запросы, чтобы периодически "будить" его, и выполняют этот код перед тем, как прийдет реальный запрос от пользователя, либо просто вынуждают несчастных первых пользователей, которые обращаются к приложению, ждать, пока вся эта логика отработает, прежде чем будут обработаны их запросы (что может вылиться для них в довольно длительное ожидание).

В ASP.NET 4 реализована новая возможность под названием "автозапуск" ("auto-start"), лучше подходящая для решения подобных задач и доступная при выполнении приложений ASP.NET 4 под управлением IIS 7.5 (он идет в поставке Windows 7 и Windows Server 2008 R2). Эта возможность дает вам способ контролируемо запускать рабочий процесс IIS и инициализировать приложение ASP.NET, чтобы затем начать принимать HTTP-запросы.

Настройка автозапуска приложения ASP.NET 4

Чтобы воспользоваться возможностью автозапуска приложений ASP.NET 4, сначала требуется настроить автоматический запуск при загрузке веб-сервера рабочего процесс IIS, в рамках которого будет выполняться ваше приложение. Это можно сделать, открыв файл applicationHost.config IIS 7.5 (C:\Windows\System32\inetsrv\config\applicationHost.config) и добавив атрибут startMode="AlwaysRunning" к соответствующему узлу <applicationPools>:

 <applicationPools>
    <add name="MyAppWorkerProcess" managedRuntimeVersion="v4.0" startMode="AlwaysRunning"  />
</applicationPools>

Если вы запустите Диспетчер задач, установите галку "показывать процессы всех пользователей" и затем сохраните файл applicationHost.config с измененным атрибутом startMode - вы увидите, как сразу после сохранения запустится новый процесс w3wp.exe.

Один рабочий процесс IIS может выполнять несколько приложений ASP.NET. Вы можете указать, какие именно приложения хотите запускать автоматически при запуске рабочего процесса, добавив атрибут serviceAutoStartEnabled="true" к их узлам <application> в конфигурационном файле:

 <sites>
    <site name="MySite"id="1">
        <application path="/" serviceAutoStartEnabled="true" serviceAutoStartProvider="PreWarmMyCache" />
    </site>
</sites>
<serviceAutoStartProviders>
    <add name="PreWarmMyCache" type="PreWarmCache, MyAssembly"/>
</serviceAutoStartProviders>

Атрибут serviceAutoProvider="PreWarmMyCache" выше ссылается на узел провайдера в конфигурационном файле, позволяющего указать ваш класс, содержащий всю логику "разогрева" для вашего приложения. Соответствующие методы этого класса будут автоматически вызваны, как только загрузится рабочий процесс IIS и ваше приложение (до получения любых внешних запросов), - они могут выполнить любые действия по инициализации или заполнению кэшей данных, которые, по-вашему, необходимы перед началом обработки запросов:

 public class PreWarmCache : System.Web.Hosting.IProcessHostPreloadClient {
    public void Preload(string[] parameters) {
        // Здесь выполняется код инициализации и заполнения кэшей...
    }
}

IIS запустит ваше приложение в состоянии, в котором оно не будет принимать никаких запросов, пока не завершится работа вашего кода "разогрева". Когда код инициализации завершится, и метод Preload вернет управление, приложение ASP.NET будет помечено как готовое к обработке запросов.

Вы также можете сочетать эту новую возможность "разогрева" при автозапуске с возможностями балансировки нагрузки, реализованными в расширении IIS7 Application Request Routing (ARR), и использовать ее, чтобы уведомить балансировщик нагрузки о том, что инициализация приложения завершена, и оно готово принимать HTTP-азпросы, - в этот момент сервер может быть включен в "ферму" веб-серверов для участия в обработке запросов.

Резюме

Новая возможность автозапуска веб-приложений в ASP.NET 4 и IIS 7.5 предоставляет четко определенный подход, который вы можете использовать для осуществления ресурсоемких операций по инициализации и предвыборке кэшируемых данных при запуске приложения, прежде чем оно начнет получать запросы от пользователей. За счет этого с самого начала работы ваше приложение может быть "разогрето", обеспечивая стабильно высокий уровень производительности.

Надеюсь, вы нашли для себя что-то полезное,

Скотт

P.S. Помимо блога, я в последнее время еще использую Twitter, чтобы публиковать краткие заметки и новые ссылки. Следить за моими публикациями на Twitter вы можете здесь: https://www.twitter.com/scottgu (@scottgu - это мой псевдоним на twitter)

оригинал статьи