Как прогреть приложение ASP.NET MVC на IIS 7.5?
Мы бы хотели прогреть приложение ASP.NET MVC, размещенное на сервере IIS 7.5. Модуль разминки, который раньше был доступен по адресу http://forums.iis.net/t/1176740.aspx, был удален с некоторого времени.
Приложение следует прогревать при каждом перезапуске рабочего процесса IIS или ASP.NET по любой причине. В течение периода прогрева IIS должен возвращать некоторый код состояния HTTP, указывающий его состояние прогрева или его неспособность обслуживать клиентов.
Было бы хорошей идеей создать исполняемый файл, который перемещается по необходимым страницам сайта через HttpRequests? Исполняемый файл может быть запущен из реализации IProcessHostPreloadClient. Можно ли настроить IIS таким образом, чтобы он принимал запросы только от localhost, и после выполнения исполняемого файла он мог переключаться на все клиенты, но этот переключатель не должен запускать перезапуск IIS (очевидно).
Можно ли использовать Visual Studio 2010 - веб-тест производительности для прогрева приложения вместо создания исполняемого файла вручную? Есть ли другие альтернативы?
PS: приложение использует проверку подлинности с помощью форм и использует сеансы, поэтому важно поддерживать файлы cookie состояния и другие файлы cookie.
ОБНОВЛЕНИЕ 1 - Мы используем.NET Framework 4.0 и Entity Framework (сначала база данных) в нашем приложении. Первые обращения к запросам EF выполняются медленно. Причина разминки заключается в том, чтобы убрать эти первые хиты. Мы уже используем скомпилированные запросы в большинстве мест, и мы реализовали предварительно скомпилированные представления для EF. Размер модели и приложения очень большой и сложный. Разминка должна пройти по многим страницам, чтобы убедиться, что скомпилированные и не скомпилированные запросы EF будут выполнены хотя бы один раз, прежде чем любой конечный пользователь получит доступ к приложению.
3 ответа
Microsoft выпустила модуль, который делает именно то, что вы просите. Модуль инициализации приложений для IIS 7.5 повышает скорость отклика веб-сайтов, загружая веб-приложения до получения первого запроса.
Вы можете указать ряд URL-адресов, которые IIS будет предварительно загружать, прежде чем принимать запросы от реальных пользователей. Я не думаю, что вы можете получить истинный пользовательский опыт входа в систему, но, возможно, вы можете настроить смоделированные страницы, которые не требуют входа в систему, который выполняет ту же самую разминку, которую вы запрашиваете?
Особенность, которую я считаю наиболее привлекательной, заключается в том, что этот модуль также позволяет осуществлять повторную переработку процессов. В следующем руководстве по IIS 8.0 описан пошаговый подход к включению повторного использования процессов.
Когда IIS обнаруживает, что активный рабочий процесс перерабатывается, IIS не переключает активный трафик на новый переработанный рабочий процесс, пока новый рабочий процесс не завершит выполнение всех URL-адресов инициализации приложения в новом процессе. Это гарантирует, что клиенты, просматривающие ваш веб-сайт, не увидят страницы инициализации приложения, как только приложение будет запущено и работает.
Этот модуль инициализации приложения IIS встроен в IIS 8.0, но доступен для загрузки для IIS 7.5.
Вы можете взглянуть на следующую статью о функции автозапуска, встроенной в IIS 7.5 и ASP.NET 4.0.
Любое приложение, которое генерирует запрос сервера на размещенные ресурсы, можно использовать для прогрева процесса IIS. Сколько именно запросов вам нужно, зависит от того, какие части нужно прогреть. Как правило, разминка используется для:
- Запуск рабочего процесса. Для этого вам нужно только попросить один ресурс, чтобы прогреть процесс для всего приложения.
- Выполните любую статическую инициализацию, запуск базы данных или предварительное кэширование. Все, что вы делаете в своем файле Global.asax, произойдет, когда вы сделаете свой первый запрос, поэтому, если вы сможете выполнить всю свою инициализацию, вам все равно нужно будет сделать только один запрос страницы.
- Принудительная предварительная компиляция страниц ASP.NET. Чтобы это произошло, вам нужно попасть на каждую страницу. К счастью, это, как правило, не требует больших затрат времени, поэтому вам, скорее всего, не нужно об этом беспокоиться. Если у вас есть отдельные страницы, которые загружаются медленно, вы можете разогреть их отдельно.
Процесс "разогрева" здесь не является чем-то волшебным. Вам просто нужно заставить IIS обслуживать рассматриваемый URL. Все, что вы упомянули, позаботится об этом: использование инструмента стресс-теста для запроса URL-адреса, создание пользовательской утилиты для отправки HTTP-запросов, даже простое создание сценария для инструмента, такого как wget или сценарий PowerShell, для загрузки URL-адресов сделает это.,
Что касается ограничения доступа к localhost, насколько я знаю, в IIS, единственный способ изменить это требует перезагрузки IIS. Вы всегда можете встроить хук перед запросом в свое приложение и поддерживать его там, и ваш процесс разогрева запросит какой-то конкретный URL, который переключает это состояние в "открытое". Но я не уверен, что ты достигнешь. Если, так или иначе, пользователь попытался сделать запрос на ваш сайт до того, как вы закончили разминку, все, что могло бы произойти, это то, что вашему сайту потребовалось бы много времени, чтобы получить ответ, и в итоге он получил бы страницу, которую он запрашивал. Если вы заблокируете их вне сайта во время прогрева, они вместо этого получат сетевую ошибку браузера, из-за которой сайт будет отключен, что (для меня) звучит намного хуже.