Как заставить компиляцию представлений ASP.NET MVC?
У меня есть веб-роль Windows Azure, содержащая веб-сайт с использованием ASP.NET MVC. Когда HTTP-запрос поступает и страница сначала загружается, представление (.aspx или .cshtml) скомпилировано и занимает некоторое время, поэтому при первом запуске страницы он занимает больше времени, чем позже, обслуживая одну и ту же страницу.
Я включил <MvcBuildViews>
(описанный в этом ответе), чтобы обеспечить проверку просмотров во время компиляции, но это, похоже, не влияет на их компиляцию, когда сайт развернут и запущен.
У веб-ролей Azure есть так называемые задачи запуска, а также специальный метод OnStart()
, где я могу разместить любой код разминки, поэтому, как только я знаю, что делать, добавление в эту роль не является проблемой.
Есть ли способ принудительного компиляции всех представлений?
Ответы
Ответ 1
Выключается ASP.NET Precompilation, который может быть выполнен с помощью ClientBuildManager.PrecompileApplication и имитирует поведение компиляции по требованию, но просто компилирует каждую страницу. Пробовал - первая загрузка выглядит заметно быстрее.
Нетривиальная часть - это то, что нужно передать в качестве параметров конструктора ClientBuildManager
. Решение состоит в том, чтобы перечислять все .Applications
объекта Site
и для каждого элемента в .Applications
перечислять все .VirtualDirectories
и использовать Path
и VirtualPath
из каждого элемента в качестве параметров для конструктора ClientBuildManager
.
Ответ 2
Взгляните на Предкомпилированные представления о бритве Дэвида Эббо
Зачем вам это нужно?
Одна из причин этого - избежать любого вреда во время выполнения, когда ваш сайт запускается, поскольку компилировать во время выполнения нечего. Это может быть значим на сайтах со многими видами.
Кроме того, вам больше не нужно развертывать файлы cshtml вообще, в результате в меньшем наборе файлов развертывания.
Другим полезным преимуществом является то, что он дает вам возможность unit testваши взгляды, которые всегда были чем-то очень трудным с стандарт время исполнения сборник модель. Я расскажу об этом более подробно в будущей должности.
Ответ 3
Является ли это проблемой начальной загрузки или устойчивой проблемой? Одной из проблем является утилизация пула приложений, которая по умолчанию составляет 20-минутный тайм-аут. Если вы отключите тайм-аут (или установите его на что-то большое), это допустимое обходное решение?
Здесь другой ответ SO, в котором обсуждается тайм-аут AppPool и как его отключить. В основном:
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00
Ответ 4
Добавьте это в OnStart:
using (var serverManager = new ServerManager())
{
string siteName = RoleEnvironment.CurrentRoleInstance.Id + "_" + "Web";
var siteId = serverManager.Sites[siteName].Id;
var appVirtualDir = $"/LM/W3SVC/{siteId}/ROOT"; // Do not end this with a trailing /
var clientBuildManager = new ClientBuildManager(appVirtualDir, null, null,
new ClientBuildManagerParameter
{
PrecompilationFlags = PrecompilationFlags.Default,
});
clientBuildManager.PrecompileApplication();
}
Ответ 5
Если вы используете функциональность публикации Publish для Visual Studio, существует гораздо более простой вариант:
В диалоговом окне "Публикация" > "Параметры" разверните "Параметры публикации файла" и установите "Предварительная компиляция" во время публикации, а затем нажмите "Настройка". В диалоговом окне "Расширенные параметры предварительной компиляции" снимите флажок Разрешить предварительный скомпилированный сайт обновляться.
источник: https://msdn.microsoft.com/en-us/library/hh475319.aspx