Как разогреть приложение 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 - Web Performance Test для разогрева приложения вместо создания исполняемого файла вручную? Есть ли другие альтернативы?

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

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


person Dhwanil Shah    schedule 12.09.2011    source источник
comment
Связано: stackoverflow.com/questions/13250679/   -  person Gert Arnold    schedule 26.11.2012
comment
Попробуйте проверить мое решение. Он не будет возвращать специальный код состояния, а вместо этого будет ждать разминки, чтобы ответить на запросы.   -  person Jason    schedule 07.03.2014


Ответы (3)


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

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

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

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

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

person Jacob Hamacher    schedule 20.09.2012

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

person Darin Dimitrov    schedule 12.09.2011
comment
Спасибо, что проявили к этому интерес. Пожалуйста, проверьте ОБНОВЛЕНИЕ 1 в исходном запросе, который дает больше контекста проблемы. Использование метода, указанного в блоге ScottGu, может не помочь выполнить все наши требования. Нам нужно, чтобы сайт работал, но не был доступен для всех, пока он не прогреется. Нам нужно пройтись по нашим страницам, прежде чем разрешить всем доступ к ним. - person Dhwanil Shah; 12.09.2011
comment
@Dhwanil Shah, разминка происходит, когда IIS начинает работать, то есть после перезагрузки вашего сервера и намного раньше, чем первый запрос успел поразить ваше приложение. - person Darin Dimitrov; 12.09.2011
comment
Смогу ли я получить доступ к страницам своего сайта из кода внутри реализации IProcessHostPreloadClient? - person Dhwanil Shah; 12.09.2011
comment
@Dhwanil Shah, что вы имеете в виду под доступом к страницам моего сайта? Если он должен отправлять им HTTP-запросы, то нет, вы не сможете сделать это внутри своей IProcessHostPreloadClient реализации, потому что IIS не будет разрешать какие-либо HTTP-запросы до завершения процесса подготовки. В этом весь смысл разминки. - person Darin Dimitrov; 12.09.2011
comment
Мне нужно получить доступ к страницам моего сайта, чтобы разогреть используемые в них запросы EF. Мне нужно войти в систему, перемещаться, искать, добавлять-редактировать и т. Д. С помощью HTTP-запросов. У нас уже есть базовый уровень нормальной разминки в событии запуска приложения Global.asax. - person Dhwanil Shah; 12.09.2011
comment
@Dhwanil Shah, в этом случае вы не можете использовать функцию автозапуска. Вам нужно будет написать несколько скриптов для ботов, которые будут перемещаться по вашему сайту. Конечно, чтобы это работало, ваш сайт должен быть в сети. Или, если у вас есть возможность отключить его для обычных пользователей и все же разрешить некоторым внутренним пользователям доступ к нему, вы можете запрограммировать эти сценарии для доступа к сайту из внутренней сети или что-то в этом роде. После того, как вы просканировали все свои страницы с помощью бота, вы можете разместить сайт в сети. Я думаю, что ваш вопрос лучше подходит для serverfault.com, поскольку он не совсем связан с программированием. - person Darin Dimitrov; 12.09.2011
comment
Я разместил запрос на serverfault.com - serverfault.com/questions/310479/ - person Dhwanil Shah; 12.09.2011

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

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

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

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

person Michael Edenfield    schedule 12.09.2011
comment
Вы можете предварительно скомпилировать страницы перед развертыванием (во время процесса сборки), что дает дополнительное преимущество, заключающееся в обнаружении ошибок, которые не обнаруживаются во время компиляции C # / VB.NET. - person Jakub Konecki; 12.09.2011
comment
@Michael - Спасибо, что проявили к этому интерес. Пожалуйста, проверьте ОБНОВЛЕНИЕ 1, чтобы получить более подробную информацию о запросе. - person Dhwanil Shah; 12.09.2011
comment
@Jakub - мы используем предварительную компиляцию ASP.NET. - person Dhwanil Shah; 12.09.2011