Как прогреть приложение ASP.NET MVC на IIS 7.5? - PullRequest
17 голосов
/ 12 сентября 2011

Мы бы хотели прогреть приложение 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 ]

11 голосов
/ 21 сентября 2012

Microsoft выпустила модуль, который делает именно то, что вы просите.Модуль инициализации приложений для IIS 7.5 повышает скорость отклика веб-сайтов, загружая веб-приложения до получения первого запроса.

Вы можете указать серию URL-адресов, которые IIS будет предварительно загружать перед принятием запросов от реальных пользователей.Я не думаю, что вы можете получить истинный пользовательский опыт входа в систему, но, возможно, вы можете настроить смоделированные страницы, которые не требуют входа в систему, которая выполняет ту же самую разминку, о которой вы просите?

Функция, которую я считаю наиболее убедительной, заключается вчто этот модуль также допускает повторное использование процесса. Следующее руководство по IIS 8.0 включает пошаговый подход к включению повторного использования процесса с перекрытием.

Когда IIS обнаруживает, что активный рабочий процесс перерабатывается, IIS не переключаетсяактивный трафик новому переработанному рабочему процессу, пока новый рабочий процесс не завершит выполнение всех URL-адресов инициализации приложения в новом процессе.Это гарантирует, что клиенты, просматривающие ваш веб-сайт, не увидят страницы инициализации приложения после того, как приложение будет запущено и работает.

Этот модуль инициализации приложения IIS встроен в IIS 8.0, но доступен для загрузки для IIS 7.5.

9 голосов
/ 12 сентября 2011

Вы можете взглянуть на следующую запись для функции автозапуска, встроенной в IIS 7.5 и ASP.NET 4.0.

5 голосов
/ 12 сентября 2011

Любое приложение, которое генерирует запрос сервера на размещенные ресурсы, можно использовать для прогрева процесса IIS. Сколько именно запросов вам нужно, зависит от того, какие части нужно прогреть. Как правило, прогрев используется для:

  • Запуск рабочего процесса. Для этого вам нужно только запросить один ресурс, чтобы прогреть процесс для всего приложения.
  • Выполнение статической инициализации, запуска базы данных или предварительного кэширования. Все, что вы делаете в своем файле Global.asax, произойдет, когда вы сделаете свой первый запрос, поэтому, если вы сможете выполнить всю инициализацию, вам все равно нужно будет сделать только один запрос страницы.
  • Принудительная предварительная компиляция страниц ASP.NET. Чтобы это произошло, вам нужно попасть на каждую страницу. К счастью, это, как правило, не требует больших затрат времени, поэтому вам не нужно беспокоиться об этом. Если у вас есть отдельные страницы, которые загружаются медленно, вы можете разогреть их отдельно.

Процесс "разогрева" здесь не является чем-то волшебным. Вам просто нужно заставить IIS обслуживать рассматриваемый URL. Все, что вы упомянули, позаботится об этом: использование инструмента стресс-теста для запроса URL-адреса, написание пользовательской утилиты для отправки HTTP-запросов, даже простое создание сценария для инструмента, такого как wget или сценарий PowerShell, для загрузки URL-адресов сделает это. .

Что касается ограничения доступа к localhost, насколько я знаю, в IIS, единственный способ изменить это требует перезагрузки IIS. Вы всегда можете встроить хук перед запросом в свое приложение и поддерживать его там, а ваш процесс разогрева запрашивает какой-то конкретный URL, который переключает это состояние в «открытое». Но я не уверен, что ты достигнешь. Если, так или иначе, пользователь попытался сделать запрос на ваш сайт до того, как закончится разминка, все, что может случиться, это то, что вашему сайту потребуется много времени, чтобы отреагировать, и в итоге он получит запрашиваемую страницу. Если вы заблокировали их вне сайта во время прогрева, они вместо этого получат сетевую ошибку браузера, из-за которой сайт будет отключен, что (для меня) звучит намного хуже.

...