Компиляция на месте с использованием ClientBuildManager.CompileFile
Я работаю над веб-сайтом, который я бы хотел использовать для компиляции на месте, чтобы сделать первый клик быстрее. Я хотел бы использовать метод ClientBuildManager
. CompileFile
, чтобы сделать компиляцию на месте так что я могу контролировать процесс компиляции. По целому ряду причин это идеальный способ скомпилировать этот сайт.
Почему IIS создается в другом подкаталоге в разделе "Временные файлы ASP.NET" ?
Когда я скомпилирую файл сайта с помощью ClientBuildManager
. CompileFile
в exe для этой цели, выход переходит в подкаталог в разделе "Временные файлы ASP.NET" . Однако, когда сайт попадает позже, IIS перестраивает элементы управления под другим подкаталогом в разделе "Временные файлы ASP.NET" , что делает предыдущую компиляцию на месте бесполезной.
Примечание. Сборки, созданные во время компиляции на месте в разделе "Временные файлы ASP.NET" , остаются в силе (все еще существуют).
Примечание. Как папка сборок сборки на месте, так и папка сгенерированных сборок IIS находятся под одним и тем же файлом "Временные файлы ASP.NET" .
Пример:
- C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Временные файлы ASP.NET\root\2ba591b9\[ имя папки компиляции на месте]
- C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Временные файлы ASP.NET\root\2ba591b9\[ Созданные IIS сборки для веб-сайта]\
var buildParameter = new ClientBuildManagerParameter
{
PrecompilationFlags = PrecompilationFlags.Default,
};
var clientBuildManager = new ClientBuildManager(
RootVirtualPath, RootPhysicalPath, null, buildParameter);
...
clientBuildManager.CompileFile(relativeVirtualPath, callback);
Где RootVirtualPath
просто "для веб-сайта по умолчанию. RootPhysicalPath
указывает на местоположение на диске веб-сайта. relativeVirtualPath
имеет вид" ~/myFile.aspx". Обратный вызов используется для отслеживания прогресса.
Ответы
Ответ 1
Я думаю, что то, что вы видите, фактически не связано с использованием CompileFile
vs PrecompileApplication
. т.е. если вы должны сделать то же самое, но вызвать PrecompileApplication()
, вы все равно получите несоответствие папки.
Обратите внимание, что технически вы не создаете объект CBM правильно. Правильный способ его вызова - полагаться на информацию IIS для поиска файлов. Для этого:
- Передайте что-то вроде
/LM/W3SVC/7/ROOT/
для appVirtualDir
- Передайте null для
appPhysicalSourceDir
Обратите внимание, что "7" - всего лишь пример. Чтобы получить правильный номер:
- Запустить inetmgr
- Перейдите к дополнительным настройкам для сайта
- Найдите идентификатор сайта. То, что вы хотите в
/LM/W3SVC/ID/ROOT/
Я объясняю это для записи, потому что, к сожалению, мне не удалось заставить папки соответствовать даже таким образом. Возможно, этот сценарий просто разбит в ASP.NET(он работает!).
Альтернативная возможность - сделать это на стороне сервера. например.
- укажите страницу на своем сайте, которую вы будете использовать для запуска выборочной предварительной компиляции.
- В этом случае вызовите
BuildManager.GetCompiledType("~/myfile.aspx")
и аналогичные вызовы для каждой страницы (или пользовательского элемента управления и т.д.), которые вы хотите прекомпилировать.
- Если вы хотите запустить свою предварительную компиляцию, просто спросите, что страница
Конечно, есть и низкотехнологичная альтернатива просто запрашивать страницы, которые вы хотите скомпилировать заранее, чтобы разогреть ваш сайт.
Ответ 2
Сэм, ответ - это ответ между Дэвидом Эббо и вашим исходным кодом.
var buildParameter = new ClientBuildManagerParameter
{
PrecompilationFlags = PrecompilationFlags.Default,
};
var clientBuildManager = new ClientBuildManager(
RootVirtualPath, RootPhysicalPath, null, buildParameter);
...
clientBuildManager.CompileFile(relativeVirtualPath, callback);
Если вы сделаете то, что сказал Дэвид Эббо, и используйте это для RootVirtualPath при построении ClientBuildManager:
/LM/W3SVC/7/ROOT/
вам необходимо передать значение null для RootPhysicalPath.
Это должно избавиться от остальных проблем, и оно должно быть создано в том же каталоге, который ищет IIS.