Как разогревать приложение 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 так, чтобы он принимал запросы только с локального хоста, и как только исполняемый файл был выполнен, он может переключиться на всех клиентов, но этот коммутатор не должен запускать перезапуск IIS (очевидно).

Можно ли использовать тест Visual Studio 2010 - Web Performance Test для разминки приложения вместо создания исполняемого файла вручную? Любые другие альтернативы?

PS: приложение использует аутентификацию форм и использует сеансы, поэтому важно поддерживать состояние cookie и другие файлы cookie.

ОБНОВЛЕНИЕ 1 - Мы используем .NET Framework 4.0 и Entity Framework (сначала базу данных) в нашем приложении. Первые обращения к EF-запросам медленны. Причина разминки заключается в том, чтобы получить эти первые обратные удары. Мы уже используем скомпилированные запросы в большинстве мест, и мы внедрили предварительно скомпилированные представления для EF. Размер модели и приложения очень большой и сложный. Для прогревания нужно пройти через многие страницы, чтобы гарантировать, что скомпилированные и не скомпилированные запросы EF выполняются как минимум один раз, прежде чем какой-либо конечный пользователь получит доступ к приложению.

Ответы

Ответ 1

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

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